gproxy_protocol/wire/
declared.rs1use std::{
4 collections::{BTreeMap, HashMap},
5 hash::{BuildHasher, Hash},
6 marker::PhantomData,
7};
8
9pub 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 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}