sark-http 0.22.0

HTTP wire types, semantics, codecs, and ownership invariants for Sark
Documentation
use std::num::NonZero;

use crate::{
    h1::{field, head::Boundary},
    request::span,
};

#[derive(Clone, Copy)]
pub(super) struct Tail {
    fields: span::Span,
    wire: NonZero<u32>,
}

impl Tail {
    pub(super) fn new(start: u32, end: field::End) -> Result<Self, Boundary> {
        let fields = span::Span::from_range(start as usize..end.fields() as usize)
            .map_err(Boundary::Span)?;
        Ok(Self {
            fields,
            wire: end.wire_len(),
        })
    }

    pub(super) const fn fields(self) -> span::Span {
        self.fields
    }

    pub(super) const fn wire_len(self) -> NonZero<u32> {
        self.wire
    }
}

const _: () = {
    assert!(core::mem::size_of::<Tail>() == 12);
    assert!(core::mem::size_of::<Option<Tail>>() == 12);
};