Skip to main content

sark_http/payload/response/headers/
value.rs

1use o3::buffer::storage;
2
3use crate::{field::Value, payload::response::headers::Name};
4
5pub(super) enum Inner<'req> {
6    Str(Value<&'req str>),
7    Borrowed(Value<&'req [u8]>),
8    Retained(Value<storage::Shared>),
9}
10
11impl<'req> Inner<'req> {
12    pub(super) fn borrow(&self) -> Value<&[u8]> {
13        match self {
14            Self::Str(value) => value.borrow(),
15            Self::Borrowed(value) => value.borrow(),
16            Self::Retained(value) => value.borrow(),
17        }
18    }
19}
20
21pub struct Item<'req> {
22    pub(super) name: Name<&'req [u8]>,
23    pub(super) value: Inner<'req>,
24}
25
26impl<'req> Item<'req> {
27    pub fn from_str(name: Name<&'req [u8]>, value: Value<&'req str>) -> Self {
28        Self {
29            name,
30            value: Inner::Str(value),
31        }
32    }
33
34    pub fn borrow(name: Name<&'req [u8]>, value: Value<&'req [u8]>) -> Self {
35        Self {
36            name,
37            value: Inner::Borrowed(value),
38        }
39    }
40
41    pub fn retain(name: Name<&'req [u8]>, value: Value<storage::Shared>) -> Self {
42        Self {
43            name,
44            value: Inner::Retained(value),
45        }
46    }
47
48    pub(crate) const fn placeholder() -> Self {
49        Self {
50            name: crate::field::literal!(Name::try_bytes(b"x")),
51            value: Inner::Borrowed(crate::field::literal!(Value::try_bytes(b""))),
52        }
53    }
54
55    pub fn name_bytes(&self) -> &[u8] {
56        self.name.as_bytes()
57    }
58
59    pub fn value_bytes(&self) -> &[u8] {
60        self.value.borrow().into_inner()
61    }
62}