multistore_cf_workers/headers.rs
1//! Newtype wrapper for `web_sys::Headers` enabling ergonomic conversions
2//! with [`http::HeaderMap`].
3//!
4//! Rust's orphan rule prevents implementing `From<&HeaderMap>` directly on
5//! `web_sys::Headers`. This wrapper provides those conversions while
6//! remaining transparent to use via [`into_inner`](WsHeaders::into_inner).
7
8use http::HeaderMap;
9
10/// Thin wrapper around [`web_sys::Headers`] that enables [`From`] conversions
11/// with [`HeaderMap`].
12///
13/// # Example
14///
15/// ```rust,ignore
16/// let ws: WsHeaders = WsHeaders::from(&header_map);
17/// init.set_headers(&ws.into_inner().into());
18/// ```
19pub struct WsHeaders(web_sys::Headers);
20
21impl WsHeaders {
22 /// Unwrap into the inner `web_sys::Headers`.
23 pub fn into_inner(self) -> web_sys::Headers {
24 self.0
25 }
26}
27
28impl From<&HeaderMap> for WsHeaders {
29 fn from(headers: &HeaderMap) -> Self {
30 let ws = web_sys::Headers::new().unwrap();
31 for (key, value) in headers.iter() {
32 if let Ok(v) = value.to_str() {
33 let _ = ws.set(key.as_str(), v);
34 }
35 }
36 WsHeaders(ws)
37 }
38}