1pub mod auth;
2pub mod header;
3pub mod typed;
4pub mod untyped;
5pub use header::Header;
6pub use untyped::*;
7
8#[derive(Debug, PartialEq, Eq, Clone, Default)]
11pub struct Headers(Vec<Header>);
12
13impl Headers {
14 pub fn push(&mut self, h: Header) {
15 self.0.push(h)
16 }
17
18 pub fn unique_push(&mut self, h: Header) {
19 self.0
20 .retain(|s| std::mem::discriminant(s) != std::mem::discriminant(&h));
21 self.push(h);
22 }
23
24 pub fn iter(&self) -> impl Iterator<Item = &Header> {
25 self.0.iter()
26 }
27
28 pub fn extend(&mut self, i: Vec<Header>) {
29 self.0.extend(i)
30 }
31
32 pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut Header> {
33 self.0.iter_mut()
34 }
35
36 pub fn is_empty(&self) -> bool {
37 self.0.is_empty()
38 }
39
40 pub fn retain<F>(&mut self, f: F)
41 where
42 F: FnMut(&Header) -> bool,
43 {
44 self.0.retain(f)
45 }
46}
47
48impl IntoIterator for Headers {
49 type IntoIter = ::std::vec::IntoIter<Self::Item>;
50 type Item = Header;
51
52 fn into_iter(self) -> Self::IntoIter {
53 self.0.into_iter()
54 }
55}
56
57impl std::convert::From<Header> for Headers {
58 fn from(header: Header) -> Self {
59 Self(vec![header])
60 }
61}
62
63impl std::convert::From<Vec<Header>> for Headers {
64 fn from(headers: Vec<Header>) -> Self {
65 Self(headers)
66 }
67}
68
69impl std::convert::From<Headers> for Vec<Header> {
70 fn from(from: Headers) -> Self {
71 from.0
72 }
73}
74
75impl std::fmt::Display for Headers {
76 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
77 if self.is_empty() {
78 write!(f, "")
79 } else {
80 write!(
81 f,
82 "{}\r\n",
83 self.iter()
84 .map(|s| s.to_string())
85 .collect::<Vec<_>>()
86 .join("\r\n")
87 )
88 }
89 }
90}