sark-http 0.28.4

HTTP wire types, semantics, codecs, and ownership invariants for Sark
Documentation
use crate::h1::head::request::trace::Context;

pub struct Parent {
    pub(in crate::h1::head::request) context: Context,
}

impl Parent {
    pub const BYTES: usize = 55;
    pub const HEADER_BYTES: usize = b"traceparent: ".len() + Self::BYTES + 2;

    pub const fn from_ids(trace_id: &[u8; 16], span_id: &[u8; 8]) -> Self {
        Self {
            context: Context {
                trace_id: *trace_id,
                span_id: *span_id,
            },
        }
    }

    pub fn to_bytes(&self) -> [u8; Self::BYTES] {
        let mut bytes = [0; Self::BYTES];
        bytes[..3].copy_from_slice(b"00-");
        Self::write_hex(&mut bytes[3..35], &self.context.trace_id);
        bytes[35] = b'-';
        Self::write_hex(&mut bytes[36..52], &self.context.span_id);
        bytes[52..].copy_from_slice(b"-01");
        bytes
    }

    fn write_hex<const N: usize>(output: &mut [u8], input: &[u8; N]) {
        const HEX: &[u8; 16] = b"0123456789abcdef";
        for (index, byte) in input.iter().copied().enumerate() {
            output[index * 2] = HEX[usize::from(byte >> 4)];
            output[index * 2 + 1] = HEX[usize::from(byte & 0x0f)];
        }
    }
}

const _: () = assert!(size_of::<Parent>() == 24);