Skip to main content

varint_fmt

Function varint_fmt 

Source
pub open spec fn varint_fmt<const MINIMAL: bool>() -> VarIntFmt<MINIMAL>
Expand description
{
    Mapped {
        inner: Bind(
            U8,
            |b1: u8| match b1 {
                b if b < VARINT_TAG_U16 => L(Empty),
                VARINT_TAG_U16 => {
                    R(L(Refined(U16Le, |v| MINIMAL ==> VARINT_TAG_U16 <= v)))
                }
                VARINT_TAG_U32 => R(R(L(Refined(U32Le, |v| MINIMAL ==> u16::MAX < v)))),
                VARINT_TAG_U64 => {
                    R(R(R(L(Refined(U64Le, |v| MINIMAL ==> u32::MAX < v)))))
                }
                _ => R(R(R(R(Void("Impossible"))))),
            },
        ),
        mapper: (
            |parsed: (u8, Sum<(), Sum<u16, Sum<u32, Sum<u64, Never>>>>)| match parsed {
                (b, L(_)) => b as u64,
                (VARINT_TAG_U16, R(L(v))) => v as u64,
                (VARINT_TAG_U32, R(R(L(v)))) => v as u64,
                (VARINT_TAG_U64, R(R(R(L(v))))) => v,
                _ => arbitrary(),
            },
            |v: u64| {
                match v {
                    v if v < VARINT_TAG_U16 as u64 => (v as u8, L(())),
                    v if v <= u16::MAX as u64 => (VARINT_TAG_U16, R(L(v as u16))),
                    v if v <= u32::MAX as u64 => (VARINT_TAG_U32, R(R(L(v as u32)))),
                    _ => (VARINT_TAG_U64, R(R(R(L(v))))),
                }
            },
        ),
    }
}