tf_rust_engineio/
header.rs1use 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}