1use std::fmt::{self, Formatter};
2
3use indexmap::IndexMap;
4use serde::{
5 Deserialize, Deserializer, Serialize, Serializer,
6 de::{Error as DeError, MapAccess, SeqAccess, Visitor},
7 ser::SerializeMap,
8};
9
10use crate::{ConstValue, Name, Number, Value};
11
12#[cfg(feature = "raw_value")]
17pub const RAW_VALUE_TOKEN: &str = "$serde_json::private::RawValue";
18
19impl Serialize for ConstValue {
20 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
21 match self {
22 ConstValue::Null => serializer.serialize_none(),
23 ConstValue::Number(v) => v.serialize(serializer),
24 ConstValue::String(v) => serializer.serialize_str(v),
25 ConstValue::Boolean(v) => serializer.serialize_bool(*v),
26 ConstValue::Binary(v) => serializer.serialize_bytes(v),
27 ConstValue::Enum(v) => serializer.serialize_str(v),
28 ConstValue::List(v) => v.serialize(serializer),
29 ConstValue::Object(v) => {
30 #[cfg(feature = "raw_value")]
31 if v.len() == 1
32 && let Some(ConstValue::String(v)) = v.get(RAW_VALUE_TOKEN)
33 && let Ok(v) = serde_json::value::RawValue::from_string(v.clone())
34 {
35 return v.serialize(serializer);
36 }
37 v.serialize(serializer)
38 }
39 }
40 }
41}
42
43impl<'de> Deserialize<'de> for ConstValue {
44 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
45 struct ValueVisitor;
46
47 impl<'de> Visitor<'de> for ValueVisitor {
48 type Value = ConstValue;
49
50 #[inline]
51 fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
52 formatter.write_str("any valid value")
53 }
54
55 #[inline]
56 fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
57 where
58 E: DeError,
59 {
60 Ok(ConstValue::Boolean(v))
61 }
62
63 #[inline]
64 fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
65 where
66 E: DeError,
67 {
68 Ok(ConstValue::Number(v.into()))
69 }
70
71 #[inline]
72 fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
73 where
74 E: DeError,
75 {
76 Ok(ConstValue::Number(v.into()))
77 }
78
79 #[inline]
80 fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
81 where
82 E: DeError,
83 {
84 Ok(Number::from_f64(v).map_or(ConstValue::Null, ConstValue::Number))
85 }
86
87 #[inline]
88 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
89 where
90 E: DeError,
91 {
92 Ok(ConstValue::String(v.to_string()))
93 }
94
95 #[inline]
96 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
97 where
98 E: DeError,
99 {
100 Ok(ConstValue::String(v))
101 }
102
103 #[inline]
104 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
105 where
106 E: DeError,
107 {
108 Ok(ConstValue::Binary(v.to_vec().into()))
109 }
110
111 #[inline]
112 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
113 where
114 E: DeError,
115 {
116 Ok(ConstValue::Binary(v.into()))
117 }
118
119 #[inline]
120 fn visit_none<E>(self) -> Result<Self::Value, E>
121 where
122 E: DeError,
123 {
124 Ok(ConstValue::Null)
125 }
126
127 #[inline]
128 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
129 where
130 D: Deserializer<'de>,
131 {
132 Deserialize::deserialize(deserializer)
133 }
134
135 #[inline]
136 fn visit_unit<E>(self) -> Result<Self::Value, E>
137 where
138 E: DeError,
139 {
140 Ok(ConstValue::Null)
141 }
142
143 fn visit_seq<A>(self, mut visitor: A) -> Result<Self::Value, A::Error>
144 where
145 A: SeqAccess<'de>,
146 {
147 let mut vec = Vec::new();
148 while let Some(elem) = visitor.next_element()? {
149 vec.push(elem);
150 }
151 Ok(ConstValue::List(vec))
152 }
153
154 fn visit_map<A>(self, mut visitor: A) -> Result<Self::Value, A::Error>
155 where
156 A: MapAccess<'de>,
157 {
158 let mut map = IndexMap::new();
159 while let Some((name, value)) = visitor.next_entry()? {
160 map.insert(name, value);
161 }
162 Ok(ConstValue::Object(map))
163 }
164 }
165
166 deserializer.deserialize_any(ValueVisitor)
167 }
168}
169
170#[derive(Debug)]
171struct SerdeVariable(Name);
172
173impl Serialize for SerdeVariable {
174 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
175 let mut s = serializer.serialize_map(Some(1))?;
176 s.serialize_entry("$var", &self.0)?;
177 s.end()
178 }
179}
180
181impl Serialize for Value {
182 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
183 match self {
184 Value::Variable(name) => SerdeVariable(name.clone()).serialize(serializer),
185 Value::Null => serializer.serialize_none(),
186 Value::Number(v) => v.serialize(serializer),
187 Value::String(v) => serializer.serialize_str(v),
188 Value::Boolean(v) => serializer.serialize_bool(*v),
189 Value::Binary(v) => serializer.serialize_bytes(v),
190 Value::Enum(v) => serializer.serialize_str(v),
191 Value::List(v) => v.serialize(serializer),
192 Value::Object(v) => v.serialize(serializer),
193 }
194 }
195}
196
197impl<'de> Deserialize<'de> for Value {
198 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
199 struct ValueVisitor;
200
201 impl<'de> Visitor<'de> for ValueVisitor {
202 type Value = Value;
203
204 #[inline]
205 fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
206 formatter.write_str("any valid value")
207 }
208
209 #[inline]
210 fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
211 where
212 E: DeError,
213 {
214 Ok(Value::Boolean(v))
215 }
216
217 #[inline]
218 fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
219 where
220 E: DeError,
221 {
222 Ok(Value::Number(v.into()))
223 }
224
225 #[inline]
226 fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
227 where
228 E: DeError,
229 {
230 Ok(Value::Number(v.into()))
231 }
232
233 #[inline]
234 fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
235 where
236 E: DeError,
237 {
238 Ok(Number::from_f64(v).map_or(Value::Null, Value::Number))
239 }
240
241 #[inline]
242 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
243 where
244 E: DeError,
245 {
246 Ok(Value::String(v.to_string()))
247 }
248
249 #[inline]
250 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
251 where
252 E: DeError,
253 {
254 Ok(Value::String(v))
255 }
256
257 #[inline]
258 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
259 where
260 E: DeError,
261 {
262 Ok(Value::Binary(v.to_vec().into()))
263 }
264
265 #[inline]
266 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
267 where
268 E: DeError,
269 {
270 Ok(Value::Binary(v.into()))
271 }
272
273 #[inline]
274 fn visit_none<E>(self) -> Result<Self::Value, E>
275 where
276 E: DeError,
277 {
278 Ok(Value::Null)
279 }
280
281 #[inline]
282 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
283 where
284 D: Deserializer<'de>,
285 {
286 Deserialize::deserialize(deserializer)
287 }
288
289 #[inline]
290 fn visit_unit<E>(self) -> Result<Self::Value, E>
291 where
292 E: DeError,
293 {
294 Ok(Value::Null)
295 }
296
297 fn visit_seq<A>(self, mut visitor: A) -> Result<Self::Value, A::Error>
298 where
299 A: SeqAccess<'de>,
300 {
301 let mut vec = Vec::new();
302 while let Some(elem) = visitor.next_element()? {
303 vec.push(elem);
304 }
305 Ok(Value::List(vec))
306 }
307
308 fn visit_map<A>(self, mut visitor: A) -> Result<Self::Value, A::Error>
309 where
310 A: MapAccess<'de>,
311 {
312 let mut map = IndexMap::new();
313 while let Some((name, value)) = visitor.next_entry()? {
314 match &value {
315 Value::String(value) if name == "$var" => {
316 return Ok(Value::Variable(Name::new(value)));
317 }
318 _ => {
319 map.insert(name, value);
320 }
321 }
322 }
323 Ok(Value::Object(map))
324 }
325 }
326
327 deserializer.deserialize_any(ValueVisitor)
328 }
329}
330
331#[cfg(test)]
332mod tests {
333 use super::*;
334
335 #[test]
336 fn var_serde() {
337 let var = Value::Variable(Name::new("abc"));
338 let s = serde_json::to_string(&var).unwrap();
339 assert_eq!(s, r#"{"$var":"abc"}"#);
340 assert_eq!(var, serde_json::from_str(&s).unwrap());
341 }
342}