http_types/headers/
header_values.rs1use crate::headers::{HeaderValue, Values};
2
3use std::fmt::{self, Debug, Display};
4use std::iter::FromIterator;
5use std::ops::{Deref, DerefMut, Index};
6use std::slice::SliceIndex;
7
8#[derive(Clone)]
12pub struct HeaderValues {
13 pub(crate) inner: Vec<HeaderValue>,
14}
15
16impl HeaderValues {
17 pub fn append(&mut self, other: &mut Self) {
19 self.inner.append(&mut other.inner)
20 }
21
22 pub fn get(&self, index: usize) -> Option<&HeaderValue> {
24 self.inner.get(index)
25 }
26
27 pub fn get_mut(&mut self, index: usize) -> Option<&mut HeaderValue> {
29 self.inner.get_mut(index)
30 }
31
32 pub fn contains(&self, value: &HeaderValue) -> bool {
35 self.inner.contains(value)
36 }
37
38 pub fn last(&self) -> &HeaderValue {
40 self.inner
41 .last()
42 .expect("HeaderValues must always contain at least one value")
43 }
44
45 pub fn iter(&self) -> Values<'_> {
47 Values::new_values(self)
48 }
49
50 }
58
59impl<I: SliceIndex<[HeaderValue]>> Index<I> for HeaderValues {
60 type Output = I::Output;
61
62 #[inline]
63 fn index(&self, index: I) -> &Self::Output {
64 Index::index(&self.inner, index)
65 }
66}
67
68impl FromIterator<HeaderValue> for HeaderValues {
69 fn from_iter<I>(iter: I) -> HeaderValues
70 where
71 I: IntoIterator<Item = HeaderValue>,
72 {
73 let iter = iter.into_iter();
74 let mut output = Vec::with_capacity(iter.size_hint().0);
75 for v in iter {
76 output.push(v);
77 }
78 HeaderValues { inner: output }
79 }
80}
81
82impl Debug for HeaderValues {
83 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
84 if self.inner.len() == 1 {
85 write!(f, "{:?}", self.inner[0])
86 } else {
87 f.debug_list().entries(self.inner.iter()).finish()
88 }
89 }
90}
91
92impl Display for HeaderValues {
93 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
94 let mut list = f.debug_list();
95 for v in &self.inner {
96 list.entry(&v);
97 }
98 list.finish()
99 }
100}
101
102impl PartialEq<str> for HeaderValues {
103 fn eq(&self, other: &str) -> bool {
104 self.inner.len() == 1 && self.inner[0] == other
105 }
106}
107
108impl<'a> PartialEq<&'a str> for HeaderValues {
109 fn eq(&self, other: &&'a str) -> bool {
110 self.inner.len() == 1 && &self.inner[0] == other
111 }
112}
113
114impl<'a> PartialEq<[&'a str]> for HeaderValues {
115 fn eq(&self, other: &[&'a str]) -> bool {
116 self.inner.iter().eq(other.iter())
117 }
118}
119
120impl PartialEq<String> for HeaderValues {
121 fn eq(&self, other: &String) -> bool {
122 self.inner.len() == 1 && self.inner[0] == *other
123 }
124}
125
126impl<'a> PartialEq<&String> for HeaderValues {
127 fn eq(&self, other: &&String) -> bool {
128 self.inner.len() == 1 && self.inner[0] == **other
129 }
130}
131
132impl From<HeaderValue> for HeaderValues {
133 fn from(other: HeaderValue) -> Self {
134 Self { inner: vec![other] }
135 }
136}
137
138impl AsRef<HeaderValue> for HeaderValues {
139 fn as_ref(&self) -> &HeaderValue {
140 &self.inner[0]
141 }
142}
143
144impl AsMut<HeaderValue> for HeaderValues {
145 fn as_mut(&mut self) -> &mut HeaderValue {
146 &mut self.inner[0]
147 }
148}
149
150impl Deref for HeaderValues {
151 type Target = HeaderValue;
152
153 fn deref(&self) -> &HeaderValue {
154 &self.inner[0]
155 }
156}
157
158impl DerefMut for HeaderValues {
159 fn deref_mut(&mut self) -> &mut HeaderValue {
160 &mut self.inner[0]
161 }
162}
163
164impl<'a> IntoIterator for &'a HeaderValues {
165 type Item = &'a HeaderValue;
166 type IntoIter = Values<'a>;
167
168 #[inline]
169 fn into_iter(self) -> Self::IntoIter {
170 self.iter()
171 }
172}
173
174impl From<Vec<HeaderValue>> for HeaderValues {
175 fn from(headers: Vec<HeaderValue>) -> Self {
176 Self { inner: headers }
177 }
178}
179
180impl IntoIterator for HeaderValues {
181 type Item = HeaderValue;
182 type IntoIter = std::vec::IntoIter<HeaderValue>;
183
184 #[inline]
185 fn into_iter(self) -> Self::IntoIter {
186 self.inner.into_iter()
187 }
188}
189
190#[cfg(test)]
191mod tests {
192 use super::*;
193
194 #[test]
195 fn test_debug_single() {
196 let header_values = HeaderValues {
197 inner: vec!["foo0".parse().unwrap()],
198 };
199 assert_eq!(format!("{:?}", header_values), "\"foo0\"");
200 }
201 #[test]
202 fn test_debug_multiple() {
203 let header_values = HeaderValues {
204 inner: vec!["foo0".parse().unwrap(), "foo1".parse().unwrap()],
205 };
206 assert_eq!(format!("{:?}", header_values), r#"["foo0", "foo1"]"#);
207 }
208}