Skip to main content

tf_rust_engineio/
header.rs

1use crate::Error;
2use bytes::Bytes;
3use http::{
4    header::HeaderName as HttpHeaderName, HeaderMap as HttpHeaderMap,
5    HeaderValue as HttpHeaderValue,
6};
7use std::collections::HashMap;
8use std::convert::TryFrom;
9use std::fmt::{Display, Formatter, Result as FmtResult};
10use std::str::FromStr;
11
12#[derive(Eq, PartialEq, Hash, Debug, Clone)]
13pub struct HeaderName {
14    inner: Box<str>,
15}
16
17#[derive(Eq, PartialEq, Hash, Debug, Clone)]
18pub struct HeaderValue {
19    inner: Bytes,
20}
21
22#[derive(Eq, PartialEq, Debug, Clone, Default)]
23pub struct HeaderMap {
24    map: HashMap<HeaderName, HeaderValue>,
25}
26
27pub struct IntoIter {
28    inner: std::collections::hash_map::IntoIter<HeaderName, HeaderValue>,
29}
30
31impl Display for HeaderName {
32    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
33        f.write_str(self.inner.as_ref())
34    }
35}
36
37impl From<String> for HeaderName {
38    fn from(string: String) -> Self {
39        HeaderName {
40            inner: string.into_boxed_str(),
41        }
42    }
43}
44
45impl TryFrom<HeaderName> for HttpHeaderName {
46    type Error = Error;
47    fn try_from(
48        header: HeaderName,
49    ) -> std::result::Result<Self, <Self as std::convert::TryFrom<HeaderName>>::Error> {
50        Ok(HttpHeaderName::from_str(header.inner.as_ref())?)
51    }
52}
53
54impl From<HttpHeaderName> for HeaderName {
55    fn from(header: HttpHeaderName) -> Self {
56        HeaderName::from(header.to_string())
57    }
58}
59
60impl From<String> for HeaderValue {
61    fn from(string: String) -> Self {
62        HeaderValue {
63            inner: Bytes::from(string),
64        }
65    }
66}
67
68impl TryFrom<HeaderValue> for HttpHeaderValue {
69    type Error = Error;
70    fn try_from(
71        value: HeaderValue,
72    ) -> std::result::Result<Self, <Self as std::convert::TryFrom<HeaderValue>>::Error> {
73        Ok(HttpHeaderValue::from_bytes(&value.inner[..])?)
74    }
75}
76
77impl From<HttpHeaderValue> for HeaderValue {
78    fn from(value: HttpHeaderValue) -> Self {
79        HeaderValue {
80            inner: Bytes::copy_from_slice(value.as_bytes()),
81        }
82    }
83}
84
85impl From<&str> for HeaderValue {
86    fn from(string: &str) -> Self {
87        Self::from(string.to_owned())
88    }
89}
90
91impl TryFrom<HeaderMap> for HttpHeaderMap {
92    type Error = Error;
93    fn try_from(
94        headers: HeaderMap,
95    ) -> std::result::Result<Self, <Self as std::convert::TryFrom<HeaderMap>>::Error> {
96        headers
97            .into_iter()
98            .map(|(key, value)| {
99                Ok((
100                    HttpHeaderName::try_from(key)?,
101                    HttpHeaderValue::try_from(value)?,
102                ))
103            })
104            .collect()
105    }
106}
107
108impl IntoIterator for HeaderMap {
109    type Item = (HeaderName, HeaderValue);
110    type IntoIter = IntoIter;
111    fn into_iter(self) -> <Self as std::iter::IntoIterator>::IntoIter {
112        IntoIter {
113            inner: self.map.into_iter(),
114        }
115    }
116}
117
118impl HeaderMap {
119    pub fn new() -> Self {
120        HeaderMap {
121            map: HashMap::new(),
122        }
123    }
124
125    pub fn insert<T: Into<HeaderName>, U: Into<HeaderValue>>(
126        &mut self,
127        key: T,
128        value: U,
129    ) -> Option<HeaderValue> {
130        self.map.insert(key.into(), value.into())
131    }
132}
133
134impl Iterator for IntoIter {
135    type Item = (HeaderName, HeaderValue);
136    fn next(&mut self) -> std::option::Option<<Self as std::iter::Iterator>::Item> {
137        self.inner.next()
138    }
139}