pbjson_types/
wrappers.rs

1use prost::bytes::Bytes;
2
3use alloc::string::String;
4use alloc::string::ToString;
5
6macro_rules! ser_scalar_value {
7    ($typ: ty) => {
8        impl serde::Serialize for $typ {
9            fn serialize<S>(&self, ser: S) -> Result<S::Ok, S::Error>
10            where
11                S: serde::Serializer,
12            {
13                self.value.serialize(ser)
14            }
15        }
16    };
17}
18macro_rules! deser_scalar_value {
19    ($typ: ty) => {
20        impl<'de> serde::Deserialize<'de> for $typ {
21            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
22            where
23                D: serde::Deserializer<'de>,
24            {
25                let value = serde::Deserialize::deserialize(deserializer)?;
26                Ok(Self { value })
27            }
28        }
29    };
30}
31macro_rules! ser_bytes_value {
32    ($typ: ty) => {
33        impl serde::Serialize for $typ {
34            fn serialize<S>(&self, ser: S) -> Result<S::Ok, S::Error>
35            where
36                S: serde::Serializer,
37            {
38                use pbjson::private::base64::engine::Engine;
39                let value =
40                    pbjson::private::base64::engine::general_purpose::STANDARD.encode(&self.value);
41                value.serialize(ser)
42            }
43        }
44    };
45}
46macro_rules! deser_bytes_value {
47    ($typ: ty) => {
48        impl<'de> serde::Deserialize<'de> for $typ {
49            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
50            where
51                D: serde::Deserializer<'de>,
52            {
53                let value = pbjson::private::BytesDeserialize::deserialize(deserializer)?.0;
54                Ok(Self { value })
55            }
56        }
57    };
58}
59macro_rules! ser_long_value {
60    ($typ: ty) => {
61        impl serde::Serialize for $typ {
62            fn serialize<S>(&self, ser: S) -> Result<S::Ok, S::Error>
63            where
64                S: serde::Serializer,
65            {
66                let value = self.value.to_string();
67                value.serialize(ser)
68            }
69        }
70    };
71}
72macro_rules! deser_number_value {
73    ($typ: ty) => {
74        impl<'de> serde::Deserialize<'de> for $typ {
75            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
76            where
77                D: serde::Deserializer<'de>,
78            {
79                let value = pbjson::private::NumberDeserialize::deserialize(deserializer)?.0;
80                Ok(Self { value })
81            }
82        }
83    };
84}
85
86macro_rules! convert_scalar_value {
87    ($scalar: ty, $typ: ty) => {
88        impl From<$scalar> for $typ {
89            fn from(value: $scalar) -> Self {
90                Self { value }
91            }
92        }
93    };
94}
95
96ser_scalar_value!(crate::BoolValue);
97deser_scalar_value!(crate::BoolValue);
98ser_bytes_value!(crate::BytesValue);
99deser_bytes_value!(crate::BytesValue);
100ser_scalar_value!(crate::DoubleValue);
101deser_number_value!(crate::DoubleValue);
102ser_scalar_value!(crate::FloatValue);
103deser_number_value!(crate::FloatValue);
104ser_scalar_value!(crate::Int32Value);
105deser_number_value!(crate::Int32Value);
106ser_long_value!(crate::Int64Value);
107deser_number_value!(crate::Int64Value);
108ser_scalar_value!(crate::StringValue);
109deser_scalar_value!(crate::StringValue);
110ser_scalar_value!(crate::UInt32Value);
111deser_number_value!(crate::UInt32Value);
112ser_long_value!(crate::UInt64Value);
113deser_number_value!(crate::UInt64Value);
114
115convert_scalar_value!(bool, crate::BoolValue);
116convert_scalar_value!(Bytes, crate::BytesValue);
117convert_scalar_value!(f64, crate::DoubleValue);
118convert_scalar_value!(f32, crate::FloatValue);
119convert_scalar_value!(i32, crate::Int32Value);
120convert_scalar_value!(i64, crate::Int64Value);
121convert_scalar_value!(String, crate::StringValue);
122convert_scalar_value!(u32, crate::UInt32Value);
123convert_scalar_value!(u64, crate::UInt64Value);