Skip to main content

gproxy_protocol/wire/
declared.rs

1//! Same-type rebuilding, not a content IR or a serde round trip.
2
3use std::{
4    collections::{BTreeMap, HashMap},
5    hash::{BuildHasher, Hash},
6    marker::PhantomData,
7};
8
9/// Recursively retain declared fields while replacing explicit extension bags
10/// with their default value. No extension value is read or cloned. A formal
11/// JSON Schema/arguments/metadata field is data, even when it uses the same map
12/// or JSON value type as an extension bag, and is therefore retained intact.
13pub trait DeclaredFields: Sized {
14    fn into_declared(self) -> Self;
15}
16
17macro_rules! scalar {
18    ($($ty:ty),* $(,)?) => { $(impl DeclaredFields for $ty { fn into_declared(self) -> Self { self } })* };
19}
20scalar!(
21    (),
22    bool,
23    char,
24    u8,
25    u16,
26    u32,
27    u64,
28    u128,
29    usize,
30    i8,
31    i16,
32    i32,
33    i64,
34    i128,
35    isize,
36    f32,
37    f64,
38    String,
39    bytes::Bytes,
40    serde_json::Number,
41    serde_json::Value,
42    crate::connection::HttpBody,
43    crate::connection::Multipart,
44    crate::connection::MultipartPart,
45    http::HeaderMap,
46    http::Method,
47    http::StatusCode
48);
49
50impl<T> DeclaredFields for PhantomData<T> {
51    fn into_declared(self) -> Self {
52        self
53    }
54}
55impl DeclaredFields for &str {
56    fn into_declared(self) -> Self {
57        self
58    }
59}
60impl<T: DeclaredFields> DeclaredFields for Option<T> {
61    fn into_declared(self) -> Self {
62        self.map(DeclaredFields::into_declared)
63    }
64}
65impl<T: DeclaredFields> DeclaredFields for Vec<T> {
66    fn into_declared(self) -> Self {
67        self.into_iter()
68            .map(DeclaredFields::into_declared)
69            .collect()
70    }
71}
72impl<T: DeclaredFields> DeclaredFields for Box<T> {
73    fn into_declared(self) -> Self {
74        Box::new((*self).into_declared())
75    }
76}
77impl<T: DeclaredFields, const N: usize> DeclaredFields for [T; N] {
78    fn into_declared(self) -> Self {
79        self.map(DeclaredFields::into_declared)
80    }
81}
82impl<K: Ord, V: DeclaredFields> DeclaredFields for BTreeMap<K, V> {
83    fn into_declared(self) -> Self {
84        self.into_iter()
85            .map(|(key, value)| (key, value.into_declared()))
86            .collect()
87    }
88}
89impl<K: Eq + Hash, V: DeclaredFields, S: BuildHasher> DeclaredFields for HashMap<K, V, S> {
90    fn into_declared(mut self) -> Self {
91        // Keep the original hasher, including its state, without requiring
92        // either it or the values to implement Clone or Default.
93        let entries: Vec<_> = self.drain().collect();
94        self.extend(
95            entries
96                .into_iter()
97                .map(|(key, value)| (key, value.into_declared())),
98        );
99        self
100    }
101}
102impl DeclaredFields for serde_json::Map<String, serde_json::Value> {
103    fn into_declared(self) -> Self {
104        self
105    }
106}
107impl<B: DeclaredFields> DeclaredFields for crate::WireRequest<B> {
108    fn into_declared(self) -> Self {
109        Self {
110            method: self.method,
111            path: self.path,
112            query: self.query,
113            headers: self.headers,
114            body: self.body.into_declared(),
115        }
116    }
117}
118impl<B: DeclaredFields> DeclaredFields for crate::WireResponse<B> {
119    fn into_declared(self) -> Self {
120        Self {
121            status: self.status,
122            headers: self.headers,
123            body: self.body.into_declared(),
124        }
125    }
126}