safe_http/
header_values.rs1mod 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}