proto_types/
protobuf_impls.rs1#[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}