76 lines
2.2 KiB
Rust
76 lines
2.2 KiB
Rust
macro_rules! impl_any_conversions {
|
|
($type: ty) => {
|
|
impl_any_conversions!($type, );
|
|
};
|
|
($type: ty, $($li: lifetime)?) => {
|
|
impl<'__der: $($li),*, $($li),*> TryFrom<$crate::AnyRef<'__der>> for $type {
|
|
type Error = $crate::Error;
|
|
|
|
fn try_from(any: $crate::AnyRef<'__der>) -> Result<$type> {
|
|
any.decode_as()
|
|
}
|
|
}
|
|
|
|
#[cfg(feature = "alloc")]
|
|
impl<'__der: $($li),*, $($li),*> TryFrom<&'__der $crate::Any> for $type {
|
|
type Error = $crate::Error;
|
|
|
|
fn try_from(any: &'__der $crate::Any) -> Result<$type> {
|
|
any.decode_as()
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
macro_rules! impl_string_type {
|
|
($type: ty, $($li: lifetime)?) => {
|
|
impl_any_conversions!($type, $($li),*);
|
|
|
|
mod __impl_string {
|
|
use super::*;
|
|
|
|
use crate::{
|
|
ord::OrdIsValueOrd, BytesRef, DecodeValue, EncodeValue, Header, Length, Reader,
|
|
Result, Writer,
|
|
};
|
|
use core::{fmt, str};
|
|
|
|
impl<$($li),*> AsRef<str> for $type {
|
|
fn as_ref(&self) -> &str {
|
|
self.as_str()
|
|
}
|
|
}
|
|
|
|
impl<$($li),*> AsRef<[u8]> for $type {
|
|
fn as_ref(&self) -> &[u8] {
|
|
self.as_bytes()
|
|
}
|
|
}
|
|
|
|
impl<'__der: $($li),*, $($li),*> DecodeValue<'__der> for $type {
|
|
fn decode_value<R: Reader<'__der>>(reader: &mut R, header: Header) -> Result<Self> {
|
|
Self::new(BytesRef::decode_value(reader, header)?.as_slice())
|
|
}
|
|
}
|
|
|
|
impl<$($li),*> EncodeValue for $type {
|
|
fn value_len(&self) -> Result<Length> {
|
|
self.inner.value_len()
|
|
}
|
|
|
|
fn encode_value(&self, writer: &mut impl Writer) -> Result<()> {
|
|
self.inner.encode_value(writer)
|
|
}
|
|
}
|
|
|
|
impl<$($li),*> OrdIsValueOrd for $type {}
|
|
|
|
impl<$($li),*> fmt::Display for $type {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
f.write_str(self.as_str())
|
|
}
|
|
}
|
|
}
|
|
};
|
|
}
|