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