1use crate::{
5    BytesRef, DecodeValue, EncodeValue, FixedTag, Header, Length, Reader, Result, Tag, Writer,
6};
7
8#[cfg(feature = "alloc")]
9use alloc::boxed::Box;
10
11pub trait Sequence<'a>: DecodeValue<'a> + EncodeValue {}
15
16impl<'a, S> FixedTag for S
17where
18    S: Sequence<'a>,
19{
20    const TAG: Tag = Tag::Sequence;
21}
22
23#[cfg(feature = "alloc")]
24impl<'a, T> Sequence<'a> for Box<T> where T: Sequence<'a> {}
25
26pub struct SequenceRef<'a> {
31    body: BytesRef<'a>,
33}
34
35impl<'a> DecodeValue<'a> for SequenceRef<'a> {
36    fn decode_value<R: Reader<'a>>(reader: &mut R, header: Header) -> Result<Self> {
37        Ok(Self {
38            body: BytesRef::decode_value(reader, header)?,
39        })
40    }
41}
42
43impl EncodeValue for SequenceRef<'_> {
44    fn value_len(&self) -> Result<Length> {
45        Ok(self.body.len())
46    }
47
48    fn encode_value(&self, writer: &mut impl Writer) -> Result<()> {
49        self.body.encode_value(writer)
50    }
51}
52
53impl<'a> Sequence<'a> for SequenceRef<'a> {}