1use crate::any::{Any, Error, Inner};
15use base64::engine::general_purpose::STANDARD;
16use base64::Engine;
17use ordered_float::OrderedFloat;
18use serde::de::{
19 DeserializeSeed, EnumAccess, Error as _, MapAccess, SeqAccess, Unexpected, VariantAccess,
20 Visitor,
21};
22use serde::{de, forward_to_deserialize_any, Deserialize, Deserializer};
23use std::collections::{btree_map, BTreeMap};
24use std::f32;
25use std::f64;
26use std::fmt;
27use std::vec;
28
29impl<'de> Deserialize<'de> for Any {
30 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
31 where
32 D: Deserializer<'de>,
33 {
34 deserializer.deserialize_any(AnyVisitor)
35 }
36}
37
38struct AnyVisitor;
39
40impl<'de> Visitor<'de> for AnyVisitor {
41 type Value = Any;
42
43 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
44 formatter.write_str("any JSON value")
45 }
46
47 fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
48 where
49 E: de::Error,
50 {
51 Ok(Any(Inner::Bool(v)))
52 }
53
54 fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E>
55 where
56 E: de::Error,
57 {
58 Ok(Any(Inner::I8(v)))
59 }
60
61 fn visit_i16<E>(self, v: i16) -> Result<Self::Value, E>
62 where
63 E: de::Error,
64 {
65 Ok(Any(Inner::I16(v)))
66 }
67
68 fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>
69 where
70 E: de::Error,
71 {
72 Ok(Any(Inner::I32(v)))
73 }
74
75 fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
76 where
77 E: de::Error,
78 {
79 Ok(Any(Inner::I64(v)))
80 }
81
82 fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>
83 where
84 E: de::Error,
85 {
86 Ok(Any(Inner::I128(v)))
87 }
88
89 fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>
90 where
91 E: de::Error,
92 {
93 Ok(Any(Inner::U8(v)))
94 }
95
96 fn visit_u16<E>(self, v: u16) -> Result<Self::Value, E>
97 where
98 E: de::Error,
99 {
100 Ok(Any(Inner::U16(v)))
101 }
102
103 fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E>
104 where
105 E: de::Error,
106 {
107 Ok(Any(Inner::U32(v)))
108 }
109
110 fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
111 where
112 E: de::Error,
113 {
114 Ok(Any(Inner::U64(v)))
115 }
116
117 fn visit_u128<E>(self, v: u128) -> Result<Self::Value, E>
118 where
119 E: de::Error,
120 {
121 Ok(Any(Inner::U128(v)))
122 }
123
124 fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E>
125 where
126 E: de::Error,
127 {
128 Ok(Any(Inner::F32(OrderedFloat(v))))
129 }
130
131 fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
132 where
133 E: de::Error,
134 {
135 Ok(Any(Inner::F64(OrderedFloat(v))))
136 }
137
138 fn visit_char<E>(self, v: char) -> Result<Self::Value, E>
139 where
140 E: de::Error,
141 {
142 Ok(Any(Inner::Char(v)))
143 }
144
145 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
146 where
147 E: de::Error,
148 {
149 Ok(Any(Inner::String(v.to_string())))
150 }
151
152 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
153 where
154 E: de::Error,
155 {
156 Ok(Any(Inner::String(v)))
157 }
158
159 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
160 where
161 E: de::Error,
162 {
163 Ok(Any(Inner::Bytes(v.to_vec())))
164 }
165
166 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
167 where
168 E: de::Error,
169 {
170 Ok(Any(Inner::Bytes(v)))
171 }
172
173 fn visit_none<E>(self) -> Result<Self::Value, E>
174 where
175 E: de::Error,
176 {
177 Ok(Any(Inner::Null))
178 }
179
180 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
181 where
182 D: Deserializer<'de>,
183 {
184 Any::deserialize(deserializer)
185 }
186
187 fn visit_unit<E>(self) -> Result<Self::Value, E>
188 where
189 E: de::Error,
190 {
191 Ok(Any(Inner::Null))
192 }
193
194 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
195 where
196 A: SeqAccess<'de>,
197 {
198 let mut out = vec![];
199
200 while let Some(value) = seq.next_element()? {
201 out.push(value);
202 }
203
204 Ok(Any(Inner::Seq(out)))
205 }
206
207 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
208 where
209 A: MapAccess<'de>,
210 {
211 let mut out = BTreeMap::new();
212
213 while let Some((key, value)) = map.next_entry()? {
214 out.insert(key, value);
215 }
216
217 Ok(Any(Inner::Map(out)))
218 }
219}
220
221impl<'de> Deserializer<'de> for Any {
222 type Error = Error;
223
224 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
225 where
226 V: Visitor<'de>,
227 {
228 match self.0 {
229 Inner::Null => visitor.visit_unit(),
230 Inner::Bool(v) => visitor.visit_bool(v),
231 Inner::I8(v) => visitor.visit_i8(v),
232 Inner::I16(v) => visitor.visit_i16(v),
233 Inner::I32(v) => visitor.visit_i32(v),
234 Inner::I64(v) => visitor.visit_i64(v),
235 Inner::I128(v) => visitor.visit_i128(v),
236 Inner::U8(v) => visitor.visit_u8(v),
237 Inner::U16(v) => visitor.visit_u16(v),
238 Inner::U32(v) => visitor.visit_u32(v),
239 Inner::U64(v) => visitor.visit_u64(v),
240 Inner::U128(v) => visitor.visit_u128(v),
241 Inner::F32(v) => visitor.visit_f32(v.0),
242 Inner::F64(v) => visitor.visit_f64(v.0),
243 Inner::Char(v) => visitor.visit_char(v),
244 Inner::String(v) => visitor.visit_string(v),
245 Inner::Bytes(v) => visitor.visit_byte_buf(v),
246 Inner::Seq(v) => visitor.visit_seq(SeqDeserializer(v.into_iter())),
247 Inner::Map(v) => visitor.visit_map(MapDeserializer {
248 it: v.into_iter(),
249 value: None,
250 }),
251 }
252 }
253
254 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
255 where
256 V: Visitor<'de>,
257 {
258 match &self.0 {
259 Inner::String(v) if v == "NaN" => visitor.visit_f32(f32::NAN),
260 Inner::String(v) if v == "Infinity" => visitor.visit_f32(f32::INFINITY),
261 Inner::String(v) if v == "-Infinity" => visitor.visit_f32(f32::NEG_INFINITY),
262 _ => self.deserialize_any(visitor),
263 }
264 }
265
266 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
267 where
268 V: Visitor<'de>,
269 {
270 match &self.0 {
271 Inner::String(v) if v == "NaN" => visitor.visit_f64(f64::NAN),
272 Inner::String(v) if v == "Infinity" => visitor.visit_f64(f64::INFINITY),
273 Inner::String(v) if v == "-Infinity" => visitor.visit_f64(f64::NEG_INFINITY),
274 _ => self.deserialize_any(visitor),
275 }
276 }
277
278 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
279 where
280 V: Visitor<'de>,
281 {
282 match &self.0 {
283 Inner::String(v) => match STANDARD.decode(v) {
284 Ok(buf) => visitor.visit_byte_buf(buf),
285 Err(_) => self.deserialize_any(visitor),
286 },
287 _ => self.deserialize_any(visitor),
288 }
289 }
290
291 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
292 where
293 V: Visitor<'de>,
294 {
295 self.deserialize_bytes(visitor)
296 }
297
298 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
299 where
300 V: Visitor<'de>,
301 {
302 match self.0 {
303 Inner::Null => visitor.visit_none(),
304 _ => visitor.visit_some(self),
305 }
306 }
307
308 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
309 where
310 V: Visitor<'de>,
311 {
312 match self.0 {
313 Inner::Null => visitor.visit_seq(SeqDeserializer(Vec::new().into_iter())),
314 _ => self.deserialize_any(visitor),
315 }
316 }
317
318 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
319 where
320 V: Visitor<'de>,
321 {
322 match self.0 {
323 Inner::Null => visitor.visit_map(MapDeserializer {
324 it: BTreeMap::new().into_iter(),
325 value: None,
326 }),
327 _ => self.deserialize_any(visitor),
328 }
329 }
330
331 fn deserialize_enum<V>(
332 self,
333 _: &'static str,
334 _: &'static [&'static str],
335 visitor: V,
336 ) -> Result<V::Value, Self::Error>
337 where
338 V: Visitor<'de>,
339 {
340 let (variant, value) = match self.0 {
341 Inner::Map(value) => {
342 let mut iter = value.into_iter();
343 let (variant, value) = match iter.next() {
344 Some(v) => v,
345 None => {
346 return Err(Error::invalid_value(
347 Unexpected::Map,
348 &"map with a single key",
349 ))
350 }
351 };
352 if iter.next().is_some() {
353 return Err(Error::invalid_value(
354 Unexpected::Map,
355 &"map with a single key",
356 ));
357 }
358 (variant, Some(value))
359 }
360 Inner::String(variant) => (Any(Inner::String(variant)), None),
361 _ => return self.deserialize_any(visitor),
362 };
363
364 visitor.visit_enum(EnumDeserializer { variant, value })
365 }
366
367 forward_to_deserialize_any! {
368 bool i8 i16 i32 i64 u8 u16 u32 u64 char str string unit unit_struct newtype_struct tuple tuple_struct
369 struct identifier ignored_any
370 }
371}
372
373struct SeqDeserializer(vec::IntoIter<Any>);
374
375impl<'de> SeqAccess<'de> for SeqDeserializer {
376 type Error = Error;
377
378 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
379 where
380 T: DeserializeSeed<'de>,
381 {
382 match self.0.next() {
383 Some(value) => seed.deserialize(value).map(Some),
384 None => Ok(None),
385 }
386 }
387
388 fn size_hint(&self) -> Option<usize> {
389 Some(self.0.len())
390 }
391}
392
393struct MapDeserializer {
394 it: btree_map::IntoIter<Any, Any>,
395 value: Option<Any>,
396}
397
398impl<'de> MapAccess<'de> for MapDeserializer {
399 type Error = Error;
400
401 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
402 where
403 K: DeserializeSeed<'de>,
404 {
405 let (key, value) = match self.it.next() {
406 Some((key, value)) => (key, value),
407 None => return Ok(None),
408 };
409
410 self.value = Some(value);
411 seed.deserialize(KeyDeserializer(key)).map(Some)
412 }
413
414 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
415 where
416 V: DeserializeSeed<'de>,
417 {
418 match self.value.take() {
419 Some(value) => seed.deserialize(value),
420 None => Err(Error::custom("value is missing")),
421 }
422 }
423
424 fn size_hint(&self) -> Option<usize> {
425 Some(self.it.len())
426 }
427}
428
429macro_rules! deserialize_parse {
430 ($method:ident => $visit:ident) => {
431 fn $method<V>(self, visitor: V) -> Result<V::Value, Self::Error>
432 where
433 V: Visitor<'de>,
434 {
435 if let Inner::String(s) = &(self.0).0 {
436 if let Ok(v) = s.parse() {
437 return visitor.$visit(v);
438 }
439 }
440
441 self.0.$method(visitor)
442 }
443 };
444}
445
446macro_rules! deserialize_delegate {
447 ($method:ident) => {
448 fn $method<V>(self, visitor: V) -> Result<V::Value, Self::Error>
449 where
450 V: Visitor<'de>,
451 {
452 self.0.$method(visitor)
453 }
454 };
455}
456
457struct KeyDeserializer(Any);
458
459impl<'de> Deserializer<'de> for KeyDeserializer {
460 type Error = Error;
461
462 deserialize_delegate!(deserialize_any);
463
464 deserialize_parse!(deserialize_bool => visit_bool);
465 deserialize_parse!(deserialize_i8 => visit_i8);
466 deserialize_parse!(deserialize_i16 => visit_i16);
467 deserialize_parse!(deserialize_i32 => visit_i32);
468 deserialize_parse!(deserialize_i64 => visit_i64);
469 deserialize_parse!(deserialize_i128 => visit_i128);
470 deserialize_parse!(deserialize_u8 => visit_u8);
471 deserialize_parse!(deserialize_u16 => visit_u16);
472 deserialize_parse!(deserialize_u32 => visit_u32);
473 deserialize_parse!(deserialize_u64 => visit_u64);
474 deserialize_parse!(deserialize_u128 => visit_u128);
475 deserialize_parse!(deserialize_f32 => visit_f32);
476 deserialize_parse!(deserialize_f64 => visit_f64);
477
478 deserialize_delegate!(deserialize_char);
479 deserialize_delegate!(deserialize_str);
480 deserialize_delegate!(deserialize_string);
481 deserialize_delegate!(deserialize_bytes);
482 deserialize_delegate!(deserialize_byte_buf);
483
484 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
485 where
486 V: Visitor<'de>,
487 {
488 match &(self.0).0 {
489 Inner::Null => visitor.visit_none(),
490 _ => visitor.visit_some(self),
491 }
492 }
493
494 deserialize_delegate!(deserialize_unit);
495
496 fn deserialize_unit_struct<V>(
497 self,
498 name: &'static str,
499 visitor: V,
500 ) -> Result<V::Value, Self::Error>
501 where
502 V: Visitor<'de>,
503 {
504 self.0.deserialize_unit_struct(name, visitor)
505 }
506
507 fn deserialize_newtype_struct<V>(
508 self,
509 _: &'static str,
510 visitor: V,
511 ) -> Result<V::Value, Self::Error>
512 where
513 V: Visitor<'de>,
514 {
515 visitor.visit_newtype_struct(self)
516 }
517
518 deserialize_delegate!(deserialize_seq);
519
520 fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
521 where
522 V: Visitor<'de>,
523 {
524 self.0.deserialize_tuple(len, visitor)
525 }
526
527 fn deserialize_tuple_struct<V>(
528 self,
529 name: &'static str,
530 len: usize,
531 visitor: V,
532 ) -> Result<V::Value, Self::Error>
533 where
534 V: Visitor<'de>,
535 {
536 self.0.deserialize_tuple_struct(name, len, visitor)
537 }
538
539 deserialize_delegate!(deserialize_map);
540
541 fn deserialize_struct<V>(
542 self,
543 name: &'static str,
544 fields: &'static [&'static str],
545 visitor: V,
546 ) -> Result<V::Value, Self::Error>
547 where
548 V: Visitor<'de>,
549 {
550 self.0.deserialize_struct(name, fields, visitor)
551 }
552
553 fn deserialize_enum<V>(
554 self,
555 _: &'static str,
556 _: &'static [&'static str],
557 visitor: V,
558 ) -> Result<V::Value, Self::Error>
559 where
560 V: Visitor<'de>,
561 {
562 visitor.visit_enum(self)
563 }
564
565 deserialize_delegate!(deserialize_identifier);
566 deserialize_delegate!(deserialize_ignored_any);
567}
568
569impl<'de> EnumAccess<'de> for KeyDeserializer {
570 type Error = Error;
571 type Variant = UnitVariantDeserializer;
572
573 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
574 where
575 V: DeserializeSeed<'de>,
576 {
577 let value = seed.deserialize(self)?;
578 Ok((value, UnitVariantDeserializer))
579 }
580}
581
582struct UnitVariantDeserializer;
583
584impl<'de> VariantAccess<'de> for UnitVariantDeserializer {
585 type Error = Error;
586
587 fn unit_variant(self) -> Result<(), Self::Error> {
588 Ok(())
589 }
590
591 fn newtype_variant_seed<T>(
592 self,
593 _: T,
594 ) -> Result<<T as DeserializeSeed<'de>>::Value, Self::Error>
595 where
596 T: DeserializeSeed<'de>,
597 {
598 Err(Error::invalid_value(
599 Unexpected::UnitVariant,
600 &"newtype variant",
601 ))
602 }
603
604 fn tuple_variant<V>(self, _: usize, _: V) -> Result<V::Value, Self::Error>
605 where
606 V: Visitor<'de>,
607 {
608 Err(Error::invalid_value(
609 Unexpected::UnitVariant,
610 &"tuple variant",
611 ))
612 }
613
614 fn struct_variant<V>(self, _: &'static [&'static str], _: V) -> Result<V::Value, Self::Error>
615 where
616 V: Visitor<'de>,
617 {
618 Err(Error::invalid_value(
619 Unexpected::UnitVariant,
620 &"struct variant",
621 ))
622 }
623}
624
625struct EnumDeserializer {
626 variant: Any,
627 value: Option<Any>,
628}
629
630impl<'de> EnumAccess<'de> for EnumDeserializer {
631 type Error = Error;
632 type Variant = VariantDeserializer;
633
634 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
635 where
636 V: DeserializeSeed<'de>,
637 {
638 let variant = seed.deserialize(self.variant)?;
639 Ok((variant, VariantDeserializer(self.value)))
640 }
641}
642
643struct VariantDeserializer(Option<Any>);
644
645impl<'de> VariantAccess<'de> for VariantDeserializer {
646 type Error = Error;
647
648 fn unit_variant(self) -> Result<(), Self::Error> {
649 match self.0 {
650 Some(value) => Deserialize::deserialize(value),
651 None => Ok(()),
652 }
653 }
654
655 fn newtype_variant_seed<T>(
656 self,
657 seed: T,
658 ) -> Result<<T as DeserializeSeed<'de>>::Value, Self::Error>
659 where
660 T: DeserializeSeed<'de>,
661 {
662 match self.0 {
663 Some(value) => seed.deserialize(value),
664 None => Err(Error::invalid_value(
665 Unexpected::UnitVariant,
666 &"newtype variant",
667 )),
668 }
669 }
670
671 fn tuple_variant<V>(
672 self,
673 _: usize,
674 visitor: V,
675 ) -> Result<<V as Visitor<'de>>::Value, Self::Error>
676 where
677 V: Visitor<'de>,
678 {
679 match self.0 {
680 Some(Any(Inner::Seq(value))) => visitor.visit_seq(SeqDeserializer(value.into_iter())),
681 Some(v) => Err(Error::invalid_value(v.unexpected(), &"tuple variant")),
682 None => Err(Error::invalid_value(
683 Unexpected::UnitVariant,
684 &"tuple variant",
685 )),
686 }
687 }
688
689 fn struct_variant<V>(
690 self,
691 _: &'static [&'static str],
692 visitor: V,
693 ) -> Result<<V as Visitor<'de>>::Value, Self::Error>
694 where
695 V: Visitor<'de>,
696 {
697 match self.0 {
698 Some(Any(Inner::Map(value))) => visitor.visit_map(MapDeserializer {
699 it: value.into_iter(),
700 value: None,
701 }),
702 Some(v) => Err(Error::invalid_value(v.unexpected(), &"struct variant")),
703 None => Err(Error::invalid_value(
704 Unexpected::UnitVariant,
705 &"struct variant",
706 )),
707 }
708 }
709}