der/asn1/
sequence.rs
1use crate::{Decodable, Encodable, EncodeValue, Encoder, FixedTag, Length, Result, Tag};
5
6pub trait Sequence<'a>: Decodable<'a> {
11 fn fields<F, T>(&self, f: F) -> Result<T>
18 where
19 F: FnOnce(&[&dyn Encodable]) -> Result<T>;
20}
21
22impl<'a, M> EncodeValue for M
23where
24 M: Sequence<'a>,
25{
26 fn value_len(&self) -> Result<Length> {
27 self.fields(|fields| {
28 fields
29 .iter()
30 .fold(Ok(Length::ZERO), |len, field| len + field.encoded_len()?)
31 })
32 }
33
34 fn encode_value(&self, encoder: &mut Encoder<'_>) -> Result<()> {
35 self.fields(|fields| {
36 for &field in fields {
37 field.encode(encoder)?;
38 }
39
40 Ok(())
41 })
42 }
43}
44
45impl<'a, M> FixedTag for M
46where
47 M: Sequence<'a>,
48{
49 const TAG: Tag = Tag::Sequence;
50}