sark-http 0.28.6

HTTP wire types, semantics, codecs, and ownership invariants for Sark
Documentation
use o3::buffer::{
    pool,
    pool::owners,
    write::{Sink as _, SpareExt as _, consume},
};

use crate::h1::head::request::{
    Route, offers,
    pool::{Buf, Layout, Meta},
};

pub struct Open<'d> {
    bytes: pool::Span<owners::Plain<pool::Layout>, pool::Borrowed<'d>>,
}

impl<'d> Open<'d> {
    pub(in crate::h1::head::request::pool) const fn new(
        bytes: pool::Span<owners::Plain<pool::Layout>, pool::Borrowed<'d>>,
    ) -> Self {
        Self { bytes }
    }

    pub fn buffer(mut self, source: &[u8]) -> Result<Buf<'d>, consume::Error> {
        let mut out = self.bytes.spare();
        out.write_slices([[0; Layout::BYTES].as_slice(), source])?;
        out.commit();
        Ok(Buf { bytes: self.bytes })
    }

    pub fn seal(mut self, route: Route<&[u8]>) -> Result<Meta<'d>, consume::Error> {
        let method = route.method().as_bytes();
        let target = route.target().as_bytes();
        let layout = Layout::new(
            [
                method.len() as u16,
                method.len() as u16,
                (method.len() + target.len()) as u16,
                0,
            ],
            route.transition(),
        );
        let mut out = self.bytes.spare();
        out.write_slices([layout.encode().as_slice(), method, target])?;
        if let Some(offers) = offers::View::from_route(route) {
            offers.write_into(&mut out)?;
        }
        out.commit();
        Ok(Meta { bytes: self.bytes })
    }
}

const _: () = assert!(size_of::<Open<'_>>() == 2 * size_of::<usize>());