http_types/headers/
to_header_values.rs

1use std::borrow::Cow;
2use std::io;
3use std::iter;
4use std::option;
5use std::slice;
6
7use crate::headers::{HeaderValue, HeaderValues, Values};
8
9/// A trait for objects which can be converted or resolved to one or more `HeaderValue`s.
10pub trait ToHeaderValues {
11    /// Returned iterator over header values which this type may correspond to.
12    type Iter: Iterator<Item = HeaderValue>;
13
14    /// Converts this object to an iterator of resolved `HeaderValues`.
15    fn to_header_values(&self) -> crate::Result<Self::Iter>;
16}
17
18impl ToHeaderValues for HeaderValue {
19    type Iter = option::IntoIter<HeaderValue>;
20
21    fn to_header_values(&self) -> crate::Result<Self::Iter> {
22        Ok(Some(self.clone()).into_iter())
23    }
24}
25
26impl<'a> ToHeaderValues for &'a HeaderValues {
27    type Iter = iter::Cloned<Values<'a>>;
28
29    fn to_header_values(&self) -> crate::Result<Self::Iter> {
30        Ok(self.iter().cloned())
31    }
32}
33
34impl<'a> ToHeaderValues for &'a [HeaderValue] {
35    type Iter = iter::Cloned<slice::Iter<'a, HeaderValue>>;
36
37    fn to_header_values(&self) -> crate::Result<Self::Iter> {
38        Ok(self.iter().cloned())
39    }
40}
41
42impl<'a> ToHeaderValues for &'a str {
43    type Iter = option::IntoIter<HeaderValue>;
44
45    fn to_header_values(&self) -> crate::Result<Self::Iter> {
46        let value = self
47            .parse()
48            .map_err(|err| io::Error::new(io::ErrorKind::Other, err))?;
49        Ok(Some(value).into_iter())
50    }
51}
52
53impl ToHeaderValues for String {
54    type Iter = option::IntoIter<HeaderValue>;
55
56    fn to_header_values(&self) -> crate::Result<Self::Iter> {
57        self.as_str().to_header_values()
58    }
59}
60
61impl ToHeaderValues for &String {
62    type Iter = option::IntoIter<HeaderValue>;
63
64    fn to_header_values(&self) -> crate::Result<Self::Iter> {
65        self.as_str().to_header_values()
66    }
67}
68
69impl ToHeaderValues for Cow<'_, str> {
70    type Iter = option::IntoIter<HeaderValue>;
71
72    fn to_header_values(&self) -> crate::Result<Self::Iter> {
73        self.as_ref().to_header_values()
74    }
75}