use crate::error::Error;
use crate::map::HeaderMap;
use crate::name::HeaderName;
use crate::value::HeaderValue;
use smol_str::SmolStr;
pub trait HeaderSchema: Sized {
fn parse(map: &HeaderMap) -> Result<Self, Error>;
fn dump(&self) -> HeaderMap;
fn known_names() -> &'static [&'static HeaderName];
}
pub fn required(map: &HeaderMap, name: &HeaderName) -> Result<SmolStr, Error> {
map
.get(name)
.map(|v| SmolStr::new(v.as_str()))
.ok_or_else(|| Error::MissingHeader {
name: SmolStr::new(name.as_str()),
})
}
pub fn optional(map: &HeaderMap, name: &HeaderName) -> Option<SmolStr> {
map.get(name).map(|v| SmolStr::new(v.as_str()))
}
pub fn put(map: &mut HeaderMap, name: &HeaderName, value: &SmolStr) {
map.insert(name.clone(), HeaderValue::from_string(value.to_string()));
}
pub fn put_opt(map: &mut HeaderMap, name: &HeaderName, value: &Option<SmolStr>) {
if let Some(v) = value {
put(map, name, v);
}
}
pub fn from_inbound_or<F: FnOnce() -> SmolStr>(inbound: &HeaderMap, key: &HeaderName, default: F) -> SmolStr {
inbound
.get(key)
.map(|v| SmolStr::from(v.as_str()))
.unwrap_or_else(default)
}
pub fn opt_from_inbound(inbound: &HeaderMap, key: &HeaderName) -> Option<SmolStr> {
inbound.get(key).map(|v| SmolStr::from(v.as_str()))
}