tpack-core 0.1.0

Core wire codec, schema AST, validation, and native traits for TPACK
Documentation
use alloc::vec::Vec;

pub(in crate::codec) fn write_uvarint(out: &mut Vec<u8>, mut value: u64) {
    loop {
        let mut byte = (value & 0x7F) as u8;
        value >>= 7;
        if value != 0 {
            byte |= 0x80;
        }
        out.push(byte);
        if value == 0 {
            break;
        }
    }
}

pub(in crate::codec) fn write_svarint(out: &mut Vec<u8>, value: i64) {
    let raw = ((value as u64) << 1) ^ ((value >> 63) as u64);
    write_uvarint(out, raw);
}

pub(in crate::codec) fn write_text(out: &mut Vec<u8>, value: &str) {
    write_bytes(out, value.as_bytes());
}

pub(in crate::codec) fn write_bytes(out: &mut Vec<u8>, value: &[u8]) {
    write_uvarint(out, value.len() as u64);
    out.extend_from_slice(value);
}

pub(in crate::codec) fn uvarint_len(mut value: u64) -> usize {
    let mut len = 1;
    while value >= 0x80 {
        value >>= 7;
        len += 1;
    }
    len
}

pub(in crate::codec) fn max_count_from_wire(value: u64) -> Option<u64> {
    if value == 0 { None } else { Some(value) }
}