sark-http 0.29.5

HTTP wire types, semantics, codecs, and ownership invariants for Sark
#[derive(Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
#[derive(Debug)]
pub enum Field {
    ContentLength,
    TransferEncoding,
    Host,
    Trailer,
    Connection,
    KeepAlive,
    Te,
    Upgrade,
    ProxyAuthenticate,
    ProxyAuthorization,
}

impl Field {
    const VALUES: [Self; 10] = [
        Self::ContentLength,
        Self::TransferEncoding,
        Self::Host,
        Self::Trailer,
        Self::Connection,
        Self::KeepAlive,
        Self::Te,
        Self::Upgrade,
        Self::ProxyAuthenticate,
        Self::ProxyAuthorization,
    ];

    pub(in crate::h1) const NAMES: [&'static [u8]; 10] = [
        b"content-length",
        b"transfer-encoding",
        b"host",
        b"trailer",
        b"connection",
        b"keep-alive",
        b"te",
        b"upgrade",
        b"proxy-authenticate",
        b"proxy-authorization",
    ];

    pub(in crate::h1::chunk) fn get(set: u16, len: usize) -> Option<Self> {
        if set.count_ones() != 1 {
            return None;
        }
        let slot = set.trailing_zeros() as usize;
        let name = Self::NAMES.get(slot)?;
        let field = Self::VALUES.get(slot).copied()?;
        (name.len() == len).then_some(field)
    }
}

const _: () = {
    assert!(Field::NAMES[0].len() == 14);
    assert!(Field::NAMES[1].len() == 17);
    assert!(Field::NAMES[2].len() == 4);
    assert!(Field::NAMES[3].len() == 7);
    assert!(Field::NAMES[4].len() == 10);
    assert!(Field::NAMES[5].len() == 10);
    assert!(Field::NAMES[6].len() == 2);
    assert!(Field::NAMES[7].len() == 7);
    assert!(Field::NAMES[8].len() == 18);
    assert!(Field::NAMES[9].len() == 19);
};