//! The [`Sequence`] trait simplifies writing decoders/encoders which map ASN.1 //! `SEQUENCE`s to Rust structs. use crate::{ BytesRef, DecodeValue, EncodeValue, FixedTag, Header, Length, Reader, Result, Tag, Writer, }; #[cfg(feature = "alloc")] use alloc::boxed::Box; /// Marker trait for ASN.1 `SEQUENCE`s. /// /// This is mainly used for custom derive. pub trait Sequence<'a>: DecodeValue<'a> + EncodeValue {} impl<'a, S> FixedTag for S where S: Sequence<'a>, { const TAG: Tag = Tag::Sequence; } #[cfg(feature = "alloc")] impl<'a, T> Sequence<'a> for Box where T: Sequence<'a> {} /// The [`SequenceRef`] type provides raw access to the octets which comprise a /// DER-encoded `SEQUENCE`. /// /// This is a zero-copy reference type which borrows from the input data. pub struct SequenceRef<'a> { /// Body of the `SEQUENCE`. body: BytesRef<'a>, } impl<'a> DecodeValue<'a> for SequenceRef<'a> { fn decode_value>(reader: &mut R, header: Header) -> Result { Ok(Self { body: BytesRef::decode_value(reader, header)?, }) } } impl EncodeValue for SequenceRef<'_> { fn value_len(&self) -> Result { Ok(self.body.len()) } fn encode_value(&self, writer: &mut impl Writer) -> Result<()> { self.body.encode_value(writer) } } impl<'a> Sequence<'a> for SequenceRef<'a> {}