Skip to content

Commit 5fb086a

Browse files
committed
Initial impl of Values iter for HeaderValues
1 parent 9a02e17 commit 5fb086a

File tree

2 files changed

+59
-5
lines changed

2 files changed

+59
-5
lines changed

src/headers/header_values.rs

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
use crate::headers::HeaderValue;
1+
use crate::headers::{HeaderValue, Values};
2+
23
use std::fmt::{self, Display};
34
use std::iter::FromIterator;
45
use std::ops::{Deref, DerefMut, Index};
@@ -23,12 +24,30 @@ impl HeaderValues {
2324
self.inner.get(index)
2425
}
2526

27+
/// Returns a mutable reference or a value depending on the type of index.
28+
pub fn get_mut(&mut self, index: usize) -> Option<&mut HeaderValue> {
29+
self.inner.get_mut(index)
30+
}
31+
2632
/// Returns the last `HeaderValue`.
2733
pub fn last(&mut self) -> &HeaderValue {
2834
self.inner
2935
.last()
3036
.expect("HeaderValues must always contain at least one value")
3137
}
38+
39+
/// An iterator visiting all header values in arbitrary order.
40+
pub fn iter(&self) -> Values<'_> {
41+
Values::new_values(&self)
42+
}
43+
44+
// /// An iterator visiting all header values in arbitrary order, with mutable
45+
// /// references to the values.
46+
// pub fn iter_mut(&mut self) -> ValuesMut<'_> {
47+
// ValuesMut {
48+
// inner: self.headers.iter_mut(),
49+
// }
50+
// }
3251
}
3352

3453
impl<I: SliceIndex<[HeaderValue]>> Index<I> for HeaderValues {
@@ -118,3 +137,23 @@ impl DerefMut for HeaderValues {
118137
&mut self.inner[0]
119138
}
120139
}
140+
141+
impl<'a> IntoIterator for &'a HeaderValues {
142+
type Item = &'a HeaderValue;
143+
type IntoIter = Values<'a>;
144+
145+
#[inline]
146+
fn into_iter(self) -> Self::IntoIter {
147+
self.iter()
148+
}
149+
}
150+
151+
// impl<'a> IntoIterator for &'a mut HeaderValues {
152+
// type Item = &'a HeaderValue;
153+
// type IntoIter = ValuesMut<'a>;
154+
155+
// #[inline]
156+
// fn into_iter(self) -> Self::IntoIter {
157+
// self.iter_mut()
158+
// }
159+
// }

src/headers/values.rs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,29 @@ use crate::headers::{HeaderName, HeaderValue, HeaderValues};
66
/// Iterator over the header values.
77
#[derive(Debug)]
88
pub struct Values<'a> {
9-
pub(super) inner: hash_map::Values<'a, HeaderName, HeaderValues>,
9+
pub(super) inner: Option<hash_map::Values<'a, HeaderName, HeaderValues>>,
1010
slot: Option<&'a HeaderValues>,
1111
cursor: usize,
1212
}
1313

1414
impl<'a> Values<'a> {
15+
/// Constructor for `Headers`.
1516
pub(crate) fn new(inner: hash_map::Values<'a, HeaderName, HeaderValues>) -> Self {
1617
Self {
17-
inner,
18+
inner: Some(inner),
1819
slot: None,
1920
cursor: 0,
2021
}
2122
}
23+
24+
/// Constructor for `HeaderValues`.
25+
pub(crate) fn new_values(values: &'a HeaderValues) -> Self {
26+
Self {
27+
inner: None,
28+
slot: Some(values),
29+
cursor: 0,
30+
}
31+
}
2232
}
2333

2434
impl<'a> Iterator for Values<'a> {
@@ -28,7 +38,10 @@ impl<'a> Iterator for Values<'a> {
2838
loop {
2939
// Check if we have a vec in the current slot, and if not set one.
3040
if self.slot.is_none() {
31-
let next = self.inner.next()?;
41+
let next = match self.inner.as_mut() {
42+
Some(inner) => inner.next()?,
43+
None => return None,
44+
};
3245
self.cursor = 0;
3346
self.slot = Some(next);
3447
}
@@ -51,6 +64,8 @@ impl<'a> Iterator for Values<'a> {
5164

5265
#[inline]
5366
fn size_hint(&self) -> (usize, Option<usize>) {
54-
self.inner.size_hint()
67+
self.inner
68+
.map(|inner| inner.size_hint())
69+
.unwrap_or((0, None))
5570
}
5671
}

0 commit comments

Comments
 (0)