sark_http/h1/head/request/pool/
open.rs1use 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>());