Skip to main content

proto_types/
protobuf_impls.rs

1#[cfg(feature = "serde")]
2mod serde {
3	use crate::*;
4
5	use alloc::borrow::ToOwned;
6	use base64::{Engine, prelude::BASE64_STANDARD};
7	use prost::bytes::Bytes;
8	use serde::{
9		Deserialize, Deserializer, Serialize,
10		de::{self, MapAccess, SeqAccess, Visitor},
11		ser::Serializer,
12	};
13
14	use crate::{BytesValue, ListValue, NullValue, Struct, Value, value::Kind};
15
16	impl Serialize for ListValue {
17		fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
18		where
19			S: Serializer,
20		{
21			self.values.serialize(serializer)
22		}
23	}
24
25	impl<'de> Deserialize<'de> for ListValue {
26		fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
27		where
28			D: de::Deserializer<'de>,
29		{
30			let values = <::prost::alloc::vec::Vec<Value>>::deserialize(deserializer)?;
31			Ok(Self { values })
32		}
33	}
34
35	impl Serialize for Value {
36		fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
37		where
38			S: Serializer,
39		{
40			match self.kind {
41				Some(Kind::NullValue(_)) => serializer.serialize_unit(),
42				Some(Kind::NumberValue(v)) => serializer.serialize_f64(v),
43				Some(Kind::StringValue(ref v)) => serializer.serialize_str(v),
44				Some(Kind::BoolValue(v)) => serializer.serialize_bool(v),
45				Some(Kind::StructValue(ref v)) => v.serialize(serializer),
46				Some(Kind::ListValue(ref v)) => v.serialize(serializer),
47				None => Err(serde::ser::Error::custom("Value must have a variant set")),
48			}
49		}
50	}
51
52	impl<'de> Deserialize<'de> for Value {
53		fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
54		where
55			D: de::Deserializer<'de>,
56		{
57			deserializer.deserialize_any(ValueVisitor)
58		}
59	}
60
61	struct ValueVisitor;
62
63	impl<'de> Visitor<'de> for ValueVisitor {
64		type Value = Value;
65
66		fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
67			formatter.write_str("a JSON value (null, number, string, boolean, object, or array)")
68		}
69
70		fn visit_unit<E>(self) -> Result<Self::Value, E>
71		where
72			E: de::Error,
73		{
74			Ok(Value {
75				kind: Some(Kind::NullValue(NullValue::NullValue as i32)),
76			})
77		}
78
79		fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
80		where
81			E: de::Error,
82		{
83			Ok(Value {
84				kind: Some(Kind::BoolValue(v)),
85			})
86		}
87
88		fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
89		where
90			E: de::Error,
91		{
92			Ok(Value {
93				kind: Some(Kind::NumberValue(v)),
94			})
95		}
96
97		fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
98		where
99			E: de::Error,
100		{
101			Ok(Value {
102				kind: Some(Kind::StringValue(v)),
103			})
104		}
105
106		fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
107		where
108			E: de::Error,
109		{
110			self.visit_string(v.to_owned())
111		}
112
113		fn visit_map<A>(self, map: A) -> Result<Self::Value, A::Error>
114		where
115			A: MapAccess<'de>,
116		{
117			let s = Struct::deserialize(de::value::MapAccessDeserializer::new(map))?;
118			Ok(Value {
119				kind: Some(Kind::StructValue(s)),
120			})
121		}
122
123		fn visit_seq<A>(self, seq: A) -> Result<Self::Value, A::Error>
124		where
125			A: SeqAccess<'de>,
126		{
127			let l = ListValue::deserialize(de::value::SeqAccessDeserializer::new(seq))?;
128			Ok(Value {
129				kind: Some(Kind::ListValue(l)),
130			})
131		}
132	}
133
134	impl<'de> Deserialize<'de> for BytesValue {
135		fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
136		where
137			D: Deserializer<'de>,
138		{
139			struct BytesValueVisitor;
140
141			impl Visitor<'_> for BytesValueVisitor {
142				type Value = BytesValue;
143
144				fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
145					formatter.write_str("a base64 encoded string")
146				}
147
148				fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
149				where
150					E: de::Error,
151				{
152					BASE64_STANDARD
153						.decode(v)
154						.map(|value| BytesValue {
155							value: Bytes::from(value),
156						})
157						.map_err(de::Error::custom)
158				}
159			}
160
161			deserializer.deserialize_str(BytesValueVisitor)
162		}
163	}
164}