Skip to main content

ber_sequence_fmt

Function ber_sequence_fmt 

Source
pub open spec fn ber_sequence_fmt<C: SpecCombinator>(
    tag: Tag,
    content: C,
) -> Mapped<PrefixTagged<TagFmt, Tag, Bind<BerLengthFmt, FnSpec<(BerLength,), Sum<ExactLen<C, usize>, Pair<C, EocFmt>>>>>, FnSpecMapper<(BerLength, Sum<<C as SpecByteLen>::T, (<C as SpecByteLen>::T, (Tag, u8))>), <C as SpecByteLen>::T>>
Expand description
{
    #[verusfmt::skip]
    Mapped {
        inner: PrefixTagged(
            TagFmt,
            tag,
            Bind(
                BerLengthFmt,
                |len: BerLength| match len {
                    BerLength::Definite(len) => L(ExactLen(len, content)),
                    BerLength::Indefinite => R(Pair(content, EOC)),
                },
            ),
        ),
        mapper: (
            |parsed: BerSequenceWireType<C::T>| match parsed.1 {
                L(value) => value,
                R((value, _eoc)) => value,
            },
            |value: C::T| {
                let len = content.byte_len(value) as usize;
                (BerLength::Definite(len), L(value))
            },
        ),
    }
}

BER SEQUENCE accepting definite and indefinite outer length forms.

content ends in super::BerEndFmt. ExactLen makes that marker observe the end of a bounded definite body; under indefinite framing it recognizes EOC without consuming it, after which Pair consumes EOC. Serialization is normalized to definite-length BER.