Skip to main content

sark_http/h1/head/request/pool/
open.rs

1use o3::buffer::{
2    pool,
3    pool::owners,
4    write::{Sink as _, SpareExt as _, consume},
5};
6
7use crate::h1::head::request::{
8    Route, offers,
9    pool::{Buf, Layout, Meta},
10};
11
12pub struct Open<'d> {
13    bytes: pool::Span<owners::Plain<pool::Layout>, pool::Borrowed<'d>>,
14}
15
16impl<'d> Open<'d> {
17    pub(in crate::h1::head::request::pool) const fn new(
18        bytes: pool::Span<owners::Plain<pool::Layout>, pool::Borrowed<'d>>,
19    ) -> Self {
20        Self { bytes }
21    }
22
23    pub fn buffer(mut self, source: &[u8]) -> Result<Buf<'d>, consume::Error> {
24        let mut out = self.bytes.spare();
25        out.write_slices([[0; Layout::BYTES].as_slice(), source])?;
26        out.commit();
27        Ok(Buf { bytes: self.bytes })
28    }
29
30    pub fn seal(mut self, route: Route<&[u8]>) -> Result<Meta<'d>, consume::Error> {
31        let method = route.method().as_bytes();
32        let target = route.target().as_bytes();
33        let layout = Layout::new(
34            [
35                method.len() as u16,
36                method.len() as u16,
37                (method.len() + target.len()) as u16,
38                0,
39            ],
40            route.transition(),
41        );
42        let mut out = self.bytes.spare();
43        out.write_slices([layout.encode().as_slice(), method, target])?;
44        if let Some(offers) = offers::View::from_route(route) {
45            offers.write_into(&mut out)?;
46        }
47        out.commit();
48        Ok(Meta { bytes: self.bytes })
49    }
50}
51
52const _: () = assert!(size_of::<Open<'_>>() == 2 * size_of::<usize>());