sark-http 0.28.6

HTTP wire types, semantics, codecs, and ownership invariants for Sark
Documentation
pub const MAX_SECONDS: u64 = u64::MAX / 1_000_000_000;

pub const CASES: [(u64, &[u8; 29]); 4] = [
    (0, b"Thu, 01 Jan 1970 00:00:00 GMT"),
    (951_782_400, b"Tue, 29 Feb 2000 00:00:00 GMT"),
    (2_147_483_647, b"Tue, 19 Jan 2038 03:14:07 GMT"),
    (253_402_300_799, b"Fri, 31 Dec 9999 23:59:59 GMT"),
];

pub fn reference(seconds: u64) -> [u8; 29] {
    const DAYS: [&[u8; 3]; 7] = [b"Thu", b"Fri", b"Sat", b"Sun", b"Mon", b"Tue", b"Wed"];
    const MONTHS: [&[u8; 3]; 12] = [
        b"Jan", b"Feb", b"Mar", b"Apr", b"May", b"Jun", b"Jul", b"Aug", b"Sep", b"Oct", b"Nov",
        b"Dec",
    ];

    let epoch = seconds / 86_400;
    let daytime = seconds % 86_400;
    let mut days = epoch;
    let mut year = 1970_u64;
    loop {
        let span = if is_leap(year) { 366 } else { 365 };
        if days < span {
            break;
        }
        days -= span;
        year += 1;
    }
    let lengths = [
        31,
        if is_leap(year) { 29 } else { 28 },
        31,
        30,
        31,
        30,
        31,
        31,
        30,
        31,
        30,
        31,
    ];
    let mut month = 0;
    while days >= lengths[month] {
        days -= lengths[month];
        month += 1;
    }

    let mut bytes = *b"Thu, 01 Jan 1970 00:00:00 GMT";
    bytes[..3].copy_from_slice(DAYS[(epoch % 7) as usize]);
    pair(&mut bytes, 5, days + 1);
    bytes[8..11].copy_from_slice(MONTHS[month]);
    pair(&mut bytes, 12, year / 100);
    pair(&mut bytes, 14, year % 100);
    pair(&mut bytes, 17, daytime / 3_600);
    pair(&mut bytes, 20, daytime % 3_600 / 60);
    pair(&mut bytes, 23, daytime % 60);
    bytes
}

fn pair(bytes: &mut [u8; 29], at: usize, value: u64) {
    bytes[at] = b'0' + (value / 10) as u8;
    bytes[at + 1] = b'0' + (value % 10) as u8;
}

fn is_leap(year: u64) -> bool {
    year.is_multiple_of(4) && (!year.is_multiple_of(100) || year.is_multiple_of(400))
}