grafbase_sdk/types/
headers.rs1use as_header_name::AsHeaderName;
2use into_header_name::IntoHeaderName;
3
4use crate::wit;
5
6pub struct HttpHeaders(wit::Headers);
8
9pub struct GatewayHeaders(HttpHeaders);
11
12impl From<wit::Headers> for GatewayHeaders {
13 fn from(headers: wit::Headers) -> Self {
14 Self(HttpHeaders(headers))
15 }
16}
17
18impl std::ops::Deref for GatewayHeaders {
19 type Target = HttpHeaders;
20 fn deref(&self) -> &Self::Target {
21 &self.0
22 }
23}
24
25impl std::ops::DerefMut for GatewayHeaders {
26 fn deref_mut(&mut self) -> &mut Self::Target {
27 &mut self.0
28 }
29}
30
31pub struct SubgraphHeaders(HttpHeaders);
33
34impl From<wit::Headers> for SubgraphHeaders {
35 fn from(headers: wit::Headers) -> Self {
36 Self(HttpHeaders(headers))
37 }
38}
39
40impl std::ops::Deref for SubgraphHeaders {
41 type Target = HttpHeaders;
42 fn deref(&self) -> &Self::Target {
43 &self.0
44 }
45}
46
47impl std::ops::DerefMut for SubgraphHeaders {
48 fn deref_mut(&mut self) -> &mut Self::Target {
49 &mut self.0
50 }
51}
52
53impl HttpHeaders {
55 pub fn get(&self, name: impl AsHeaderName) -> Option<http::HeaderValue> {
59 self.0
60 .get(name.as_str())
61 .into_iter()
62 .next()
63 .map(|value| value.try_into().unwrap())
64 }
65
66 pub fn get_all(&self, name: impl AsHeaderName) -> impl Iterator<Item = http::HeaderValue> {
70 self.0
71 .get(name.as_str())
72 .into_iter()
73 .map(|value| value.try_into().unwrap())
74 }
75
76 pub fn has(&self, name: impl AsHeaderName) -> bool {
78 self.0.has(name.as_str())
79 }
80
81 pub fn set(&mut self, name: impl IntoHeaderName, values: impl IntoIterator<Item = http::HeaderValue>) {
84 let name = name.into_header_name();
85 let values = values
86 .into_iter()
87 .map(|value| value.as_bytes().to_vec())
88 .collect::<Vec<_>>();
89 self.0
90 .set(name.as_str(), &values)
91 .expect("We have a mut ref & validated name and values.");
92 }
93
94 pub fn remove(&mut self, name: impl AsHeaderName) -> Option<http::HeaderValue> {
97 self.0
98 .get_and_delete(name.as_str())
99 .map(|values| values.into_iter().next().map(|value| value.try_into().unwrap()))
100 .expect("We have a mut ref & validated name and values.")
101 }
102
103 pub fn append(&mut self, name: impl AsHeaderName, value: http::HeaderValue) {
106 self.0
107 .append(name.as_str(), value.as_bytes())
108 .expect("We have a mut ref & validated name and values.");
109 }
110
111 pub fn iter(&self) -> impl Iterator<Item = (http::HeaderName, http::HeaderValue)> {
114 self.0
115 .entries()
116 .into_iter()
117 .map(|(name, value)| (name.try_into().unwrap(), value.try_into().unwrap()))
118 }
119}
120
121impl From<&GatewayHeaders> for http::HeaderMap {
122 fn from(headers: &GatewayHeaders) -> Self {
123 headers.iter().collect()
124 }
125}
126
127impl From<&SubgraphHeaders> for http::HeaderMap {
128 fn from(headers: &SubgraphHeaders) -> Self {
129 headers.iter().collect()
130 }
131}
132
133impl From<SubgraphHeaders> for http::HeaderMap {
134 fn from(headers: SubgraphHeaders) -> Self {
135 headers.iter().collect()
136 }
137}
138
139mod into_header_name {
146 use http::HeaderName;
147
148 pub trait IntoHeaderName: Sealed {}
151
152 pub trait Sealed {
161 #[doc(hidden)]
162 fn into_header_name(self) -> HeaderName;
163 }
164
165 impl Sealed for HeaderName {
168 #[inline]
169 fn into_header_name(self) -> HeaderName {
170 self
171 }
172 }
173
174 impl IntoHeaderName for HeaderName {}
175
176 impl Sealed for &HeaderName {
177 #[inline]
178 fn into_header_name(self) -> HeaderName {
179 self.clone()
180 }
181 }
182
183 impl IntoHeaderName for &HeaderName {}
184
185 impl Sealed for &'static str {
186 #[inline]
187 fn into_header_name(self) -> HeaderName {
188 HeaderName::from_static(self)
189 }
190 }
191
192 impl IntoHeaderName for &'static str {}
193}
194
195mod as_header_name {
196 use http::HeaderName;
197
198 pub trait AsHeaderName: Sealed {}
201
202 pub trait Sealed {
211 #[doc(hidden)]
212 fn as_str(&self) -> &str;
213 }
214
215 impl Sealed for HeaderName {
218 #[inline]
219 fn as_str(&self) -> &str {
220 HeaderName::as_str(self)
221 }
222 }
223
224 impl AsHeaderName for HeaderName {}
225
226 impl Sealed for &HeaderName {
227 #[inline]
228 fn as_str(&self) -> &str {
229 HeaderName::as_str(self)
230 }
231 }
232
233 impl AsHeaderName for &HeaderName {}
234
235 impl Sealed for &str {
236 #[inline]
237 fn as_str(&self) -> &str {
238 self
239 }
240 }
241
242 impl AsHeaderName for &str {}
243
244 impl Sealed for String {
245 #[inline]
246 fn as_str(&self) -> &str {
247 String::as_str(self)
248 }
249 }
250
251 impl AsHeaderName for String {}
252
253 impl Sealed for &String {
254 #[inline]
255 fn as_str(&self) -> &str {
256 String::as_str(self)
257 }
258 }
259
260 impl AsHeaderName for &String {}
261}