safe_http/
header_values.rs

1mod iter;
2
3pub use iter::{IntoIter, Iter, IterMut};
4
5use crate::HeaderValue;
6
7#[derive(Debug, Clone, PartialEq, Eq, Hash)]
8pub struct HeaderValues {
9    first: HeaderValue,
10    remaining: Vec<HeaderValue>,
11}
12
13impl HeaderValues {
14    #[inline]
15    pub fn new(first: HeaderValue) -> Self {
16        Self {
17            first,
18            remaining: Vec::new(),
19        }
20    }
21
22    pub fn has_only_one(&self) -> bool {
23        self.remaining.is_empty()
24    }
25
26    pub fn push(&mut self, v: HeaderValue) {
27        self.remaining.push(v);
28    }
29
30    pub fn first(&self) -> &HeaderValue {
31        &self.first
32    }
33
34    pub fn first_mut(&mut self) -> &mut HeaderValue {
35        &mut self.first
36    }
37
38    pub fn into_first(self) -> HeaderValue {
39        self.first
40    }
41
42    pub fn iter(&self) -> Iter<'_> {
43        Iter {
44            first: Some(&self.first),
45            remaining: self.remaining.iter(),
46        }
47    }
48
49    pub fn iter_mut(&mut self) -> IterMut<'_> {
50        IterMut {
51            first: Some(&mut self.first),
52            remaining: self.remaining.iter_mut(),
53        }
54    }
55}
56
57impl From<HeaderValue> for HeaderValues {
58    #[inline]
59    fn from(v: HeaderValue) -> Self {
60        Self::new(v)
61    }
62}
63
64impl FromIterator<HeaderValue> for Option<HeaderValues> {
65    fn from_iter<T: IntoIterator<Item = HeaderValue>>(iter: T) -> Self {
66        let mut iter = iter.into_iter();
67        let first = iter.next()?;
68        let remaining = iter.collect();
69        Some(HeaderValues { first, remaining })
70    }
71}
72
73impl Extend<HeaderValue> for HeaderValues {
74    fn extend<T: IntoIterator<Item = HeaderValue>>(&mut self, iter: T) {
75        self.remaining.extend(iter)
76    }
77}
78
79impl IntoIterator for HeaderValues {
80    type Item = HeaderValue;
81
82    type IntoIter = IntoIter;
83
84    fn into_iter(self) -> Self::IntoIter {
85        IntoIter {
86            first: Some(self.first),
87            remaining: self.remaining.into_iter(),
88        }
89    }
90}
91
92impl<'r> IntoIterator for &'r HeaderValues {
93    type Item = &'r HeaderValue;
94
95    type IntoIter = Iter<'r>;
96
97    fn into_iter(self) -> Self::IntoIter {
98        self.iter()
99    }
100}