Skip to main content

sark_http/payload/owned/
segment.rs

1use std::ops;
2
3use o3::buffer::{bytes::scope, resident, segments, storage::backing};
4
5use crate::{
6    owner::{handoff, handoff::stage},
7    payload::{
8        owned::{self, Segments},
9        response,
10    },
11};
12
13/// One retained payload owner branded by its driver domain.
14#[repr(transparent)]
15#[derive(Debug, Default)]
16pub struct Segment<'d> {
17    owner: resident::Shared<'d>,
18}
19
20impl<'d> Segment<'d> {
21    pub const fn new() -> Self {
22        Self {
23            owner: resident::Shared::new(),
24        }
25    }
26
27    pub fn len(&self) -> usize {
28        self.owner.len()
29    }
30
31    pub fn is_empty(&self) -> bool {
32        self.owner.is_empty()
33    }
34
35    pub fn as_slice(&self) -> &[u8] {
36        self.owner.as_slice()
37    }
38
39    pub(crate) fn from_item(item: segments::Item<resident::Shared<'d>>) -> Self {
40        Self {
41            owner: item.into_inner(),
42        }
43    }
44
45    #[doc(hidden)]
46    pub fn backing(&self) -> Option<backing::View<'_, 'd>> {
47        self.owner.backing()
48    }
49}
50
51impl<'d> response::Body<'d> for Segment<'d> {
52    fn len(&self) -> usize {
53        self.owner.len()
54    }
55
56    fn as_slice(&self) -> Option<&[u8]> {
57        Some(self.owner.as_slice())
58    }
59
60    fn try_resolve<'req, H: scope::Source, O: stage::Body<'req, 'd>>(
61        self,
62        slot: &handoff::Slot<'req, 'd, H, O>,
63    ) -> Result<handoff::Plan<'req, 'd, H::Selection, O>, owned::Error> {
64        Ok(handoff::Plan::new(
65            slot.origin().segmented(Segments::from(self)),
66        ))
67    }
68}
69
70impl<'d> From<resident::Shared<'d>> for Segment<'d> {
71    fn from(owner: resident::Shared<'d>) -> Self {
72        Self { owner }
73    }
74}
75
76impl<'d> From<Segment<'d>> for resident::Shared<'d> {
77    fn from(part: Segment<'d>) -> Self {
78        part.owner
79    }
80}
81
82impl AsRef<[u8]> for Segment<'_> {
83    fn as_ref(&self) -> &[u8] {
84        self.owner.as_ref()
85    }
86}
87
88impl ops::Deref for Segment<'_> {
89    type Target = [u8];
90
91    fn deref(&self) -> &Self::Target {
92        self.owner.as_ref()
93    }
94}