#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct Headers {
items: Vec<(String, String)>,
}
impl Headers {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn with(self, name: impl Into<String>, value: impl Into<String>) -> Self {
let extended: Vec<(String, String)> = self
.items
.into_iter()
.chain(std::iter::once((name.into(), value.into())))
.collect();
Self { items: extended }
}
#[must_use]
pub fn get(&self, name: &str) -> Option<&str> {
self.items
.iter()
.find(|(k, _)| k.eq_ignore_ascii_case(name))
.map(|(_, v)| v.as_str())
}
pub fn iter(&self) -> std::slice::Iter<'_, (String, String)> {
self.items.iter()
}
#[must_use]
pub fn len(&self) -> usize {
self.items.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.items.is_empty()
}
}
impl<'a> IntoIterator for &'a Headers {
type Item = &'a (String, String);
type IntoIter = std::slice::Iter<'a, (String, String)>;
fn into_iter(self) -> Self::IntoIter {
self.items.iter()
}
}