sark-http 0.29.4

HTTP wire types, semantics, codecs, and ownership invariants for Sark
use crate::payload::response::headers::{self, value};

pub const DEFAULT_CAPACITY: usize = 4;
pub struct Set<'req, const N: usize = DEFAULT_CAPACITY> {
    entries: [value::Item<'req>; N],
    len: usize,
}

impl<'req, const N: usize> Default for Set<'req, N> {
    fn default() -> Self {
        Self::new()
    }
}

impl<'req, const N: usize> Set<'req, N> {
    pub fn new() -> Self {
        Self {
            entries: [const { value::Item::placeholder() }; N],
            len: 0,
        }
    }

    pub fn from_items(items: [value::Item<'req>; N]) -> Self {
        Self {
            entries: items,
            len: N,
        }
    }

    pub fn from_optional(items: [Option<value::Item<'req>>; N]) -> Self {
        let mut set = Self::new();
        for (slot, item) in set.entries.iter_mut().zip(items.into_iter().flatten()) {
            *slot = item;
            set.len += 1;
        }
        set
    }

    pub fn is_empty(&self) -> bool {
        self.len == 0
    }

    pub fn len(&self) -> usize {
        self.len
    }
}

impl<const N: usize> headers::Source for Set<'_, N> {
    fn emit<'field>(&'field self, sink: &mut impl headers::Sink<'field>) {
        for item in &self.entries[..self.len.min(N)] {
            sink.entry(headers::Entry::new(item.name, item.value.borrow()));
        }
    }
}