use derive_more::From;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Default, Clone, From, Serialize, Deserialize)]
#[serde(transparent)]
pub struct Headers {
inner: HashMap<String, String>,
}
impl Headers {
pub fn merge(&mut self, overlay: impl Into<Headers>) {
let overlay = overlay.into();
for (k, v) in overlay.inner {
self.inner.insert(k, v);
}
}
pub fn merge_with(&mut self, overlay: &Headers) {
for (k, v) in &overlay.inner {
self.inner.insert(k.clone(), v.clone());
}
}
pub fn applied_to(self, target: impl Into<Headers>) -> Headers {
let mut target = target.into();
for (k, v) in self.inner {
target.inner.insert(k, v);
}
target
}
}
impl<K, V> From<(K, V)> for Headers
where
K: Into<String>,
V: Into<String>,
{
fn from((k, v): (K, V)) -> Self {
let mut inner = HashMap::new();
inner.insert(k.into(), v.into());
Headers { inner }
}
}
impl<K, V> From<Vec<(K, V)>> for Headers
where
K: Into<String>,
V: Into<String>,
{
fn from(vec: Vec<(K, V)>) -> Self {
let inner = vec.into_iter().map(|(k, v)| (k.into(), v.into())).collect();
Headers { inner }
}
}
impl<K, V, const N: usize> From<[(K, V); N]> for Headers
where
K: Into<String>,
V: Into<String>,
{
fn from(arr: [(K, V); N]) -> Self {
let inner = arr.into_iter().map(|(k, v)| (k.into(), v.into())).collect();
Headers { inner }
}
}
use std::collections::hash_map::{IntoIter, Iter, IterMut};
impl Headers {
pub fn iter(&self) -> Iter<'_, String, String> {
self.inner.iter()
}
pub fn iter_mut(&mut self) -> IterMut<'_, String, String> {
self.inner.iter_mut()
}
}
impl IntoIterator for Headers {
type Item = (String, String);
type IntoIter = IntoIter<String, String>;
fn into_iter(self) -> Self::IntoIter {
self.inner.into_iter()
}
}
impl<'a> IntoIterator for &'a Headers {
type Item = (&'a String, &'a String);
type IntoIter = Iter<'a, String, String>;
fn into_iter(self) -> Self::IntoIter {
self.inner.iter()
}
}
impl<'a> IntoIterator for &'a mut Headers {
type Item = (&'a String, &'a mut String);
type IntoIter = IterMut<'a, String, String>;
fn into_iter(self) -> Self::IntoIter {
self.inner.iter_mut()
}
}