sark_http/payload/response/headers/
value.rs1use 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}