Skip to main content

biscotti/
request.rs

1//! Low-level types related to [`RequestCookies`].
2//!
3//! [`RequestCookies`]: crate::RequestCookies
4use crate::RequestCookie;
5use std::borrow::Cow;
6use std::slice::Iter;
7
8/// An iterator over all [`RequestCookie`]s with a given name.
9///
10/// This struct is created by the [`RequestCookies::get_all()`] method.
11///
12/// [`RequestCookies::get_all()`]: crate::RequestCookies::get_all
13pub struct CookiesForName<'map, 'cookie> {
14    pub(crate) iter: Iter<'map, Cow<'cookie, str>>,
15    pub(crate) name: Cow<'cookie, str>,
16}
17
18impl<'map, 'cookie> CookiesForName<'map, 'cookie> {
19    pub fn values(&self) -> CookieValuesForName<'map, 'cookie> {
20        CookieValuesForName {
21            iter: self.iter.clone(),
22        }
23    }
24}
25
26impl<'cookie> Iterator for CookiesForName<'_, 'cookie> {
27    type Item = RequestCookie<'cookie>;
28
29    fn next(&mut self) -> Option<Self::Item> {
30        self.iter
31            .next()
32            .map(|value| RequestCookie::new(self.name.clone(), value.clone()))
33    }
34
35    fn size_hint(&self) -> (usize, Option<usize>) {
36        self.iter.size_hint()
37    }
38}
39
40/// An iterator over all cookie values for a given cookie name.
41///
42/// This struct is created by the [`CookiesForName::values()`] method.
43pub struct CookieValuesForName<'map, 'cookie> {
44    pub(crate) iter: Iter<'map, Cow<'cookie, str>>,
45}
46
47impl<'map> Iterator for CookieValuesForName<'map, '_> {
48    type Item = &'map str;
49
50    fn next(&mut self) -> Option<Self::Item> {
51        self.iter.next().map(|value| value.as_ref())
52    }
53
54    fn size_hint(&self) -> (usize, Option<usize>) {
55        self.iter.size_hint()
56    }
57}
58
59impl ExactSizeIterator for CookiesForName<'_, '_> {}
60
61impl ExactSizeIterator for CookieValuesForName<'_, '_> {}
62
63impl DoubleEndedIterator for CookiesForName<'_, '_> {
64    fn next_back(&mut self) -> Option<Self::Item> {
65        self.iter
66            .next_back()
67            .map(|value| RequestCookie::new(self.name.clone(), value.clone()))
68    }
69}
70
71impl DoubleEndedIterator for CookieValuesForName<'_, '_> {
72    fn next_back(&mut self) -> Option<Self::Item> {
73        self.iter.next_back().map(|value| value.as_ref())
74    }
75}
76
77impl std::iter::FusedIterator for CookiesForName<'_, '_> {}
78
79impl std::iter::FusedIterator for CookieValuesForName<'_, '_> {}