Skip to main content

sark_http/payload/response/headers/
set.rs

1use crate::payload::response::headers::{self, value};
2
3pub const DEFAULT_CAPACITY: usize = 4;
4pub struct Set<'req, const N: usize = DEFAULT_CAPACITY> {
5    entries: [value::Item<'req>; N],
6    len: usize,
7}
8
9impl<'req, const N: usize> Default for Set<'req, N> {
10    fn default() -> Self {
11        Self::new()
12    }
13}
14
15impl<'req, const N: usize> Set<'req, N> {
16    pub fn new() -> Self {
17        Self {
18            entries: [const { value::Item::placeholder() }; N],
19            len: 0,
20        }
21    }
22
23    pub fn from_items(items: [value::Item<'req>; N]) -> Self {
24        Self {
25            entries: items,
26            len: N,
27        }
28    }
29
30    pub fn from_optional(items: [Option<value::Item<'req>>; N]) -> Self {
31        let mut set = Self::new();
32        for (slot, item) in set.entries.iter_mut().zip(items.into_iter().flatten()) {
33            *slot = item;
34            set.len += 1;
35        }
36        set
37    }
38
39    pub fn is_empty(&self) -> bool {
40        self.len == 0
41    }
42
43    pub fn len(&self) -> usize {
44        self.len
45    }
46}
47
48impl<const N: usize> headers::Source for Set<'_, N> {
49    fn emit<'field>(&'field self, sink: &mut impl headers::Sink<'field>) {
50        for item in &self.entries[..self.len.min(N)] {
51            sink.entry(headers::Entry::new(item.name, item.value.borrow()));
52        }
53    }
54}