sark_http/payload/owned/
segment.rs1use 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#[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}