1#![cfg(feature = "serde")]
2use crate::ast::{JsonArray, JsonBoolean, JsonField, JsonNull, JsonNumber, JsonObject, JsonString, JsonValue};
3use oak_core::OakError as Error;
4use serde::de;
5
6pub struct Serializer;
8
9pub fn to_value<T: serde::Serialize>(value: &T) -> Result<JsonValue, Error> {
11 value.serialize(Serializer)
12}
13
14pub fn from_value<T: serde::de::DeserializeOwned>(value: JsonValue) -> Result<T, Error> {
16 T::deserialize(value)
17}
18
19impl serde::ser::Serializer for Serializer {
20 type Ok = JsonValue;
21 type Error = Error;
22
23 type SerializeSeq = SerializeArray;
24 type SerializeTuple = SerializeArray;
25 type SerializeTupleStruct = SerializeArray;
26 type SerializeTupleVariant = SerializeVariant;
27 type SerializeMap = SerializeObject;
28 type SerializeStruct = SerializeObject;
29 type SerializeStructVariant = SerializeVariant;
30
31 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
32 Ok(JsonValue::Boolean(JsonBoolean { value: v, span: (0..0).into() }))
33 }
34
35 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
36 self.serialize_f64(v as f64)
37 }
38 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
39 self.serialize_f64(v as f64)
40 }
41 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
42 self.serialize_f64(v as f64)
43 }
44 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
45 self.serialize_f64(v as f64)
46 }
47 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
48 self.serialize_f64(v as f64)
49 }
50 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
51 self.serialize_f64(v as f64)
52 }
53 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
54 self.serialize_f64(v as f64)
55 }
56 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
57 self.serialize_f64(v as f64)
58 }
59 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
60 self.serialize_f64(v as f64)
61 }
62 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
63 Ok(JsonValue::Number(JsonNumber { value: v, span: (0..0).into() }))
64 }
65
66 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
67 self.serialize_str(&v.to_string())
68 }
69
70 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
71 Ok(JsonValue::String(JsonString { value: v.to_string(), span: (0..0).into() }))
72 }
73
74 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
75 let elements = v.iter().map(|&b| JsonValue::Number(JsonNumber { value: b as f64, span: (0..0).into() })).collect();
76 Ok(JsonValue::Array(JsonArray { elements, span: (0..0).into() }))
77 }
78
79 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
80 Ok(JsonValue::Null(JsonNull { span: (0..0).into() }))
81 }
82
83 fn serialize_some<T: ?Sized + serde::Serialize>(self, value: &T) -> Result<Self::Ok, Self::Error> {
84 value.serialize(self)
85 }
86
87 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
88 self.serialize_none()
89 }
90
91 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
92 self.serialize_unit()
93 }
94
95 fn serialize_unit_variant(self, _name: &'static str, _variant_index: u32, variant: &'static str) -> Result<Self::Ok, Self::Error> {
96 self.serialize_str(variant)
97 }
98
99 fn serialize_newtype_struct<T: ?Sized + serde::Serialize>(self, _name: &'static str, value: &T) -> Result<Self::Ok, Self::Error> {
100 value.serialize(self)
101 }
102
103 fn serialize_newtype_variant<T: ?Sized + serde::Serialize>(self, _name: &'static str, _variant_index: u32, variant: &'static str, value: &T) -> Result<Self::Ok, Self::Error> {
104 let mut fields = Vec::new();
105 fields.push(JsonField { name: JsonString { value: variant.to_string(), span: (0..0).into() }, value: value.serialize(self)?, span: (0..0).into() });
106 Ok(JsonValue::Object(JsonObject { fields, span: (0..0).into() }))
107 }
108
109 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
110 Ok(SerializeArray { elements: Vec::with_capacity(len.unwrap_or(0)) })
111 }
112
113 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
114 self.serialize_seq(Some(len))
115 }
116
117 fn serialize_tuple_struct(self, _name: &'static str, len: usize) -> Result<Self::SerializeTupleStruct, Self::Error> {
118 self.serialize_seq(Some(len))
119 }
120
121 fn serialize_tuple_variant(self, _name: &'static str, _variant_index: u32, variant: &'static str, len: usize) -> Result<Self::SerializeTupleVariant, Self::Error> {
122 Ok(SerializeVariant { name: variant.to_string(), elements: Vec::with_capacity(len) })
123 }
124
125 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
126 Ok(SerializeObject { fields: Vec::with_capacity(len.unwrap_or(0)), current_key: None })
127 }
128
129 fn serialize_struct(self, _name: &'static str, len: usize) -> Result<Self::SerializeStruct, Self::Error> {
130 self.serialize_map(Some(len))
131 }
132
133 fn serialize_struct_variant(self, _name: &'static str, _variant_index: u32, variant: &'static str, len: usize) -> Result<Self::SerializeStructVariant, Self::Error> {
134 Ok(SerializeVariant { name: variant.to_string(), elements: Vec::with_capacity(len) })
135 }
136}
137
138pub struct SerializeArray {
140 elements: Vec<JsonValue>,
141}
142
143impl serde::ser::SerializeSeq for SerializeArray {
144 type Ok = JsonValue;
145 type Error = Error;
146
147 fn serialize_element<T: ?Sized + serde::Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
148 self.elements.push(value.serialize(Serializer)?);
149 Ok(())
150 }
151
152 fn end(self) -> Result<Self::Ok, Self::Error> {
153 Ok(JsonValue::Array(JsonArray { elements: self.elements, span: (0..0).into() }))
154 }
155}
156
157impl serde::ser::SerializeTuple for SerializeArray {
158 type Ok = JsonValue;
159 type Error = Error;
160
161 fn serialize_element<T: ?Sized + serde::Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
162 serde::ser::SerializeSeq::serialize_element(self, value)
163 }
164
165 fn end(self) -> Result<Self::Ok, Self::Error> {
166 serde::ser::SerializeSeq::end(self)
167 }
168}
169
170impl serde::ser::SerializeTupleStruct for SerializeArray {
171 type Ok = JsonValue;
172 type Error = Error;
173
174 fn serialize_field<T: ?Sized + serde::Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
175 serde::ser::SerializeSeq::serialize_element(self, value)
176 }
177
178 fn end(self) -> Result<Self::Ok, Self::Error> {
179 serde::ser::SerializeSeq::end(self)
180 }
181}
182
183pub struct SerializeObject {
185 fields: Vec<JsonField>,
186 current_key: Option<String>,
187}
188
189impl serde::ser::SerializeMap for SerializeObject {
190 type Ok = JsonValue;
191 type Error = Error;
192
193 fn serialize_key<T: ?Sized + serde::Serialize>(&mut self, key: &T) -> Result<(), Self::Error> {
194 self.current_key = Some(key.serialize(KeySerializer)?);
195 Ok(())
196 }
197
198 fn serialize_value<T: ?Sized + serde::Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
199 let key = self.current_key.take().ok_or_else(|| <Self::Error as serde::ser::Error>::custom("serialize_value called before serialize_key"))?;
200 self.fields.push(JsonField { name: JsonString { value: key, span: (0..0).into() }, value: value.serialize(Serializer)?, span: (0..0).into() });
201 Ok(())
202 }
203
204 fn end(self) -> Result<Self::Ok, Self::Error> {
205 Ok(JsonValue::Object(JsonObject { fields: self.fields, span: (0..0).into() }))
206 }
207}
208
209impl serde::ser::SerializeStruct for SerializeObject {
210 type Ok = JsonValue;
211 type Error = Error;
212
213 fn serialize_field<T: ?Sized + serde::Serialize>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error> {
214 self.fields.push(JsonField { name: JsonString { value: key.to_string(), span: (0..0).into() }, value: value.serialize(Serializer)?, span: (0..0).into() });
215 Ok(())
216 }
217
218 fn end(self) -> Result<Self::Ok, Self::Error> {
219 Ok(JsonValue::Object(JsonObject { fields: self.fields, span: (0..0).into() }))
220 }
221}
222
223pub struct SerializeVariant {
225 name: String,
226 elements: Vec<JsonValue>,
227}
228
229impl serde::ser::SerializeTupleVariant for SerializeVariant {
230 type Ok = JsonValue;
231 type Error = Error;
232
233 fn serialize_field<T: ?Sized + serde::Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
234 self.elements.push(value.serialize(Serializer)?);
235 Ok(())
236 }
237
238 fn end(self) -> Result<Self::Ok, Self::Error> {
239 let mut fields = Vec::new();
240 fields.push(JsonField { name: JsonString { value: self.name, span: (0..0).into() }, value: JsonValue::Array(JsonArray { elements: self.elements, span: (0..0).into() }), span: (0..0).into() });
241 Ok(JsonValue::Object(JsonObject { fields, span: (0..0).into() }))
242 }
243}
244
245impl serde::ser::SerializeStructVariant for SerializeVariant {
246 type Ok = JsonValue;
247 type Error = Error;
248
249 fn serialize_field<T: ?Sized + serde::Serialize>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error> {
250 self.elements.push(JsonValue::Object(JsonObject { fields: vec![JsonField { name: JsonString { value: key.to_string(), span: (0..0).into() }, value: value.serialize(Serializer)?, span: (0..0).into() }], span: (0..0).into() }));
251 Ok(())
252 }
253
254 fn end(self) -> Result<Self::Ok, Self::Error> {
255 let mut fields = Vec::new();
256 fields.push(JsonField { name: JsonString { value: self.name, span: (0..0).into() }, value: JsonValue::Array(JsonArray { elements: self.elements, span: (0..0).into() }), span: (0..0).into() });
257 Ok(JsonValue::Object(JsonObject { fields, span: (0..0).into() }))
258 }
259}
260
261struct KeySerializer;
262
263impl serde::ser::Serializer for KeySerializer {
264 type Ok = String;
265 type Error = Error;
266 type SerializeSeq = serde::ser::Impossible<String, Error>;
267 type SerializeTuple = serde::ser::Impossible<String, Error>;
268 type SerializeTupleStruct = serde::ser::Impossible<String, Error>;
269 type SerializeTupleVariant = serde::ser::Impossible<String, Error>;
270 type SerializeMap = serde::ser::Impossible<String, Error>;
271 type SerializeStruct = serde::ser::Impossible<String, Error>;
272 type SerializeStructVariant = serde::ser::Impossible<String, Error>;
273
274 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
275 Ok(v.to_string())
276 }
277 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
278 Ok(v.to_string())
279 }
280 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
281 Ok(v.to_string())
282 }
283 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
284 Ok(v.to_string())
285 }
286 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
287 Ok(v.to_string())
288 }
289 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
290 Ok(v.to_string())
291 }
292 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
293 Ok(v.to_string())
294 }
295 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
296 Ok(v.to_string())
297 }
298 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
299 Ok(v.to_string())
300 }
301 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
302 Ok(v.to_string())
303 }
304 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
305 Ok(v.to_string())
306 }
307 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
308 Ok(v.to_string())
309 }
310 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
311 Ok(v.to_string())
312 }
313 fn serialize_bytes(self, _v: &[u8]) -> Result<Self::Ok, Self::Error> {
314 Err(<Error as serde::ser::Error>::custom("bytes cannot be a map key"))
315 }
316 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
317 Err(<Error as serde::ser::Error>::custom("none cannot be a map key"))
318 }
319 fn serialize_some<T: ?Sized + serde::Serialize>(self, _value: &T) -> Result<Self::Ok, Self::Error> {
320 Err(<Error as serde::ser::Error>::custom("some cannot be a map key"))
321 }
322 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
323 Err(<Error as serde::ser::Error>::custom("unit cannot be a map key"))
324 }
325 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
326 Err(<Error as serde::ser::Error>::custom("unit struct cannot be a map key"))
327 }
328 fn serialize_unit_variant(self, _name: &'static str, _variant_index: u32, variant: &'static str) -> Result<Self::Ok, Self::Error> {
329 Ok(variant.to_string())
330 }
331 fn serialize_newtype_struct<T: ?Sized + serde::Serialize>(self, _name: &'static str, value: &T) -> Result<Self::Ok, Self::Error> {
332 value.serialize(self)
333 }
334 fn serialize_newtype_variant<T: ?Sized + serde::Serialize>(self, _name: &'static str, _variant_index: u32, _variant: &'static str, _value: &T) -> Result<Self::Ok, Self::Error> {
335 Err(<Error as serde::ser::Error>::custom("variant cannot be a map key"))
336 }
337 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
338 Err(<Error as serde::ser::Error>::custom("seq cannot be a map key"))
339 }
340 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
341 Err(<Error as serde::ser::Error>::custom("tuple cannot be a map key"))
342 }
343 fn serialize_tuple_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeTupleStruct, Self::Error> {
344 Err(<Error as serde::ser::Error>::custom("tuple struct cannot be a map key"))
345 }
346 fn serialize_tuple_variant(self, _name: &'static str, _variant_index: u32, _variant: &'static str, _len: usize) -> Result<Self::SerializeTupleVariant, Self::Error> {
347 Err(<Error as serde::ser::Error>::custom("tuple variant cannot be a map key"))
348 }
349 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
350 Err(<Error as serde::ser::Error>::custom("map cannot be a map key"))
351 }
352 fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct, Self::Error> {
353 Err(<Error as serde::ser::Error>::custom("struct cannot be a map key"))
354 }
355 fn serialize_struct_variant(self, _name: &'static str, _variant_index: u32, _variant: &'static str, _len: usize) -> Result<Self::SerializeStructVariant, Self::Error> {
356 Err(<Error as serde::ser::Error>::custom("struct variant cannot be a map key"))
357 }
358}
359
360impl<'de> serde::de::Deserializer<'de> for JsonValue {
361 type Error = Error;
362
363 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
364 where
365 V: serde::de::Visitor<'de>,
366 {
367 match self {
368 JsonValue::Null(_) => visitor.visit_unit(),
369 JsonValue::Boolean(b) => visitor.visit_bool(b.value),
370 JsonValue::Number(n) => visitor.visit_f64(n.value),
371 JsonValue::String(s) => visitor.visit_string(s.value),
372 JsonValue::Array(a) => visitor.visit_seq(SeqDeserializer::new(a.elements)),
373 JsonValue::Object(o) => visitor.visit_map(MapDeserializer::new(o.fields)),
374 }
375 }
376
377 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
378 where
379 V: serde::de::Visitor<'de>,
380 {
381 match self {
382 JsonValue::Null(_) => visitor.visit_none(),
383 _ => visitor.visit_some(self),
384 }
385 }
386
387 fn deserialize_enum<V>(self, _name: &'static str, _variants: &'static [&'static str], visitor: V) -> Result<V::Value, Error>
388 where
389 V: serde::de::Visitor<'de>,
390 {
391 match self {
392 JsonValue::String(s) => visitor.visit_enum(EnumDeserializer::new(s.value, None)),
393 JsonValue::Object(o) => {
394 if o.fields.len() != 1 {
395 return Err(<Error as serde::de::Error>::custom(format!("Expected object with 1 field for enum, found {}", o.fields.len())));
396 }
397 let field = &o.fields[0];
398 visitor.visit_enum(EnumDeserializer::new(field.name.value.clone(), Some(field.value.clone())))
399 }
400 _ => Err(<Error as serde::de::Error>::custom(format!("Expected string or object for enum, found {:?}", self))),
401 }
402 }
403
404 fn deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value, Error>
405 where
406 V: serde::de::Visitor<'de>,
407 {
408 visitor.visit_newtype_struct(self)
409 }
410
411 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Error>
412 where
413 V: de::Visitor<'de>,
414 {
415 self.deserialize_any(visitor)
416 }
417 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Error>
418 where
419 V: de::Visitor<'de>,
420 {
421 self.deserialize_any(visitor)
422 }
423 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Error>
424 where
425 V: serde::de::Visitor<'de>,
426 {
427 self.deserialize_any(visitor)
428 }
429 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Error>
430 where
431 V: de::Visitor<'de>,
432 {
433 self.deserialize_any(visitor)
434 }
435 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Error>
436 where
437 V: serde::de::Visitor<'de>,
438 {
439 self.deserialize_any(visitor)
440 }
441 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Error>
442 where
443 V: de::Visitor<'de>,
444 {
445 self.deserialize_any(visitor)
446 }
447 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Error>
448 where
449 V: serde::de::Visitor<'de>,
450 {
451 self.deserialize_any(visitor)
452 }
453 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Error>
454 where
455 V: de::Visitor<'de>,
456 {
457 self.deserialize_any(visitor)
458 }
459 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Error>
460 where
461 V: de::Visitor<'de>,
462 {
463 self.deserialize_any(visitor)
464 }
465 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Error>
466 where
467 V: serde::de::Visitor<'de>,
468 {
469 self.deserialize_any(visitor)
470 }
471 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Error>
472 where
473 V: de::Visitor<'de>,
474 {
475 self.deserialize_any(visitor)
476 }
477 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Error>
478 where
479 V: serde::de::Visitor<'de>,
480 {
481 self.deserialize_any(visitor)
482 }
483 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Error>
484 where
485 V: serde::de::Visitor<'de>,
486 {
487 self.deserialize_any(visitor)
488 }
489 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Error>
490 where
491 V: de::Visitor<'de>,
492 {
493 self.deserialize_any(visitor)
494 }
495 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Error>
496 where
497 V: serde::de::Visitor<'de>,
498 {
499 self.deserialize_any(visitor)
500 }
501 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Error>
502 where
503 V: de::Visitor<'de>,
504 {
505 self.deserialize_any(visitor)
506 }
507 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Error>
508 where
509 V: serde::de::Visitor<'de>,
510 {
511 self.deserialize_any(visitor)
512 }
513 fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value, Error>
514 where
515 V: serde::de::Visitor<'de>,
516 {
517 self.deserialize_any(visitor)
518 }
519 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Error>
520 where
521 V: de::Visitor<'de>,
522 {
523 self.deserialize_any(visitor)
524 }
525 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error>
526 where
527 V: serde::de::Visitor<'de>,
528 {
529 self.deserialize_any(visitor)
530 }
531 fn deserialize_tuple_struct<V>(self, _name: &'static str, _len: usize, visitor: V) -> Result<V::Value, Error>
532 where
533 V: de::Visitor<'de>,
534 {
535 self.deserialize_any(visitor)
536 }
537 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Error>
538 where
539 V: serde::de::Visitor<'de>,
540 {
541 self.deserialize_any(visitor)
542 }
543 fn deserialize_struct<V>(self, _name: &'static str, _fields: &'static [&'static str], visitor: V) -> Result<V::Value, Error>
544 where
545 V: de::Visitor<'de>,
546 {
547 self.deserialize_any(visitor)
548 }
549 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Error>
550 where
551 V: de::Visitor<'de>,
552 {
553 self.deserialize_any(visitor)
554 }
555 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error>
556 where
557 V: serde::de::Visitor<'de>,
558 {
559 self.deserialize_any(visitor)
560 }
561}
562
563struct SeqDeserializer {
564 iter: std::vec::IntoIter<JsonValue>,
565}
566
567impl SeqDeserializer {
568 fn new(elements: Vec<JsonValue>) -> Self {
569 Self { iter: elements.into_iter() }
570 }
571}
572
573impl<'de> de::SeqAccess<'de> for SeqDeserializer {
574 type Error = Error;
575
576 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
577 where
578 T: de::DeserializeSeed<'de>,
579 {
580 match self.iter.next() {
581 Some(value) => seed.deserialize(value).map(Some),
582 None => Ok(None),
583 }
584 }
585}
586
587struct MapDeserializer {
588 iter: std::vec::IntoIter<JsonField>,
589 value: Option<JsonValue>,
590}
591
592impl MapDeserializer {
593 fn new(fields: Vec<JsonField>) -> Self {
594 Self { iter: fields.into_iter(), value: None }
595 }
596}
597
598impl<'de> serde::de::MapAccess<'de> for MapDeserializer {
599 type Error = Error;
600
601 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
602 where
603 K: serde::de::DeserializeSeed<'de>,
604 {
605 match self.iter.next() {
606 Some(field) => {
607 self.value = Some(field.value);
608 seed.deserialize(JsonValue::String(field.name)).map(Some)
609 }
610 None => Ok(None),
611 }
612 }
613
614 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error>
615 where
616 V: serde::de::DeserializeSeed<'de>,
617 {
618 match self.value.take() {
619 Some(value) => seed.deserialize(value),
620 None => Err(<Error as serde::de::Error>::custom("next_value_seed called before next_key_seed")),
621 }
622 }
623}
624
625struct EnumDeserializer {
626 variant: String,
627 value: Option<JsonValue>,
628}
629
630impl EnumDeserializer {
631 fn new(variant: String, value: Option<JsonValue>) -> Self {
632 Self { variant, value }
633 }
634}
635
636impl<'de> de::EnumAccess<'de> for EnumDeserializer {
637 type Error = Error;
638 type Variant = VariantDeserializer;
639
640 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Error>
641 where
642 V: de::DeserializeSeed<'de>,
643 {
644 let variant = seed.deserialize(de::value::StrDeserializer::<Error>::new(&self.variant))?;
645 Ok((variant, VariantDeserializer { value: self.value }))
646 }
647}
648
649struct VariantDeserializer {
650 value: Option<JsonValue>,
651}
652
653impl<'de> de::VariantAccess<'de> for VariantDeserializer {
654 type Error = Error;
655
656 fn unit_variant(self) -> Result<(), Error> {
657 match self.value {
658 Some(_) => Err(<Error as de::Error>::custom("Expected unit variant")),
659 None => Ok(()),
660 }
661 }
662
663 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Error>
664 where
665 T: de::DeserializeSeed<'de>,
666 {
667 match self.value {
668 Some(value) => seed.deserialize(value),
669 None => Err(<Error as de::Error>::custom("Expected newtype variant")),
670 }
671 }
672
673 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error>
674 where
675 V: de::Visitor<'de>,
676 {
677 match self.value {
678 Some(JsonValue::Array(a)) => visitor.visit_seq(SeqDeserializer::new(a.elements)),
679 _ => Err(<Error as de::Error>::custom("Expected tuple variant")),
680 }
681 }
682
683 fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value, Error>
684 where
685 V: de::Visitor<'de>,
686 {
687 match self.value {
688 Some(JsonValue::Object(o)) => visitor.visit_map(MapDeserializer::new(o.fields)),
689 _ => Err(<Error as de::Error>::custom("Expected struct variant")),
690 }
691 }
692}