#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct RawDer<'a>(pub &'a [u8]);
impl<'a> RawDer<'a> {
pub fn as_bytes(&self) -> &'a [u8] {
self.0
}
}
impl<'a> crate::traits::Decode<'a> for RawDer<'a> {
#[inline]
fn decode(decoder: &mut crate::der::decoder::Decoder<'a>) -> crate::Result<Self> {
let start = decoder.remaining();
decoder.read_tag()?;
let length = decoder.read_length()?;
if length.is_indefinite() {
decoder.read_indefinite_content()?;
} else {
let len = length.definite()?;
decoder.read_bytes(len)?;
}
let total = start.len() - decoder.remaining().len();
Ok(RawDer(&start[..total]))
}
}
impl<'a> crate::traits::DecodeImplicit<'a> for RawDer<'a> {
#[inline]
fn decode_implicit(content: &'a [u8], _encoding: crate::Encoding) -> crate::Result<Self> {
Ok(RawDer(content))
}
}
impl<'a, T: crate::traits::Decode<'a>> crate::traits::DecodeImplicit<'a> for Vec<T> {
fn decode_implicit(content: &'a [u8], encoding: crate::Encoding) -> crate::Result<Self> {
let mut decoder = crate::Decoder::new(content, encoding);
let mut elements = Vec::new();
while !decoder.is_empty() {
elements.push(T::decode(&mut decoder)?);
}
Ok(elements)
}
}
#[cfg(feature = "serde")]
impl serde::Serialize for RawDer<'_> {
fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
let hex = crate::serde_impl::bytes_to_hex(self.0);
s.serialize_str(&hex)
}
}
impl<'a> crate::traits::TagForOptional for RawDer<'a> {
fn optional_tag() -> Option<crate::Tag> {
None
}
}
impl crate::traits::Encode for RawDer<'_> {
#[inline]
fn encode(&self, encoder: &mut crate::der::encoder::Encoder) -> crate::Result<()> {
encoder.write_bytes(self.0);
Ok(())
}
#[inline]
fn encoded_len(&self) -> crate::Result<usize> {
Ok(self.0.len())
}
}