1use http::header::{HeaderMap, HeaderValue};
2
3pub mod allow;
4pub mod content_length;
5pub mod max_forwards;
6pub mod user_agent;
7
8pub trait ParseHeader: Sized {
9 fn header_name() -> &'static [&'static str];
10 fn decode<'a>(headers: impl IntoIterator<Item = &'a HeaderValue>) -> Option<Self>;
11}
12
13pub trait EncodeHeader: Into<String> {}
14
15pub trait HeaderMapParse {
16 fn typed_get<T: ParseHeader>(&self) -> Option<T>;
17}
18
19impl HeaderMapParse for HeaderMap {
20 fn typed_get<T: ParseHeader>(&self) -> Option<T> {
21 T::decode(
22 T::header_name()
23 .iter()
24 .map(|name| self.get_all(*name))
25 .flatten(),
26 )
27 }
28}