1 use crate::error::Error;
2 use crate::lib::str::FromStr;
3 use crate::lib::*;
4 use crate::map::Map;
5 use crate::number::Number;
6 use crate::value::Value;
7 use serde::de::{
8     self, Deserialize, DeserializeSeed, EnumAccess, Expected, IntoDeserializer, MapAccess,
9     SeqAccess, Unexpected, VariantAccess, Visitor,
10 };
11 use serde::{forward_to_deserialize_any, serde_if_integer128};
12 
13 #[cfg(feature = "arbitrary_precision")]
14 use crate::number::NumberFromString;
15 
16 impl<'de> Deserialize<'de> for Value {
17     #[inline]
deserialize<D>(deserializer: D) -> Result<Value, D::Error> where D: serde::Deserializer<'de>,18     fn deserialize<D>(deserializer: D) -> Result<Value, D::Error>
19     where
20         D: serde::Deserializer<'de>,
21     {
22         struct ValueVisitor;
23 
24         impl<'de> Visitor<'de> for ValueVisitor {
25             type Value = Value;
26 
27             fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
28                 formatter.write_str("any valid JSON value")
29             }
30 
31             #[inline]
32             fn visit_bool<E>(self, value: bool) -> Result<Value, E> {
33                 Ok(Value::Bool(value))
34             }
35 
36             #[inline]
37             fn visit_i64<E>(self, value: i64) -> Result<Value, E> {
38                 Ok(Value::Number(value.into()))
39             }
40 
41             #[inline]
42             fn visit_u64<E>(self, value: u64) -> Result<Value, E> {
43                 Ok(Value::Number(value.into()))
44             }
45 
46             #[inline]
47             fn visit_f64<E>(self, value: f64) -> Result<Value, E> {
48                 Ok(Number::from_f64(value).map_or(Value::Null, Value::Number))
49             }
50 
51             #[cfg(any(feature = "std", feature = "alloc"))]
52             #[inline]
53             fn visit_str<E>(self, value: &str) -> Result<Value, E>
54             where
55                 E: serde::de::Error,
56             {
57                 self.visit_string(String::from(value))
58             }
59 
60             #[cfg(any(feature = "std", feature = "alloc"))]
61             #[inline]
62             fn visit_string<E>(self, value: String) -> Result<Value, E> {
63                 Ok(Value::String(value))
64             }
65 
66             #[inline]
67             fn visit_none<E>(self) -> Result<Value, E> {
68                 Ok(Value::Null)
69             }
70 
71             #[inline]
72             fn visit_some<D>(self, deserializer: D) -> Result<Value, D::Error>
73             where
74                 D: serde::Deserializer<'de>,
75             {
76                 Deserialize::deserialize(deserializer)
77             }
78 
79             #[inline]
80             fn visit_unit<E>(self) -> Result<Value, E> {
81                 Ok(Value::Null)
82             }
83 
84             #[inline]
85             fn visit_seq<V>(self, mut visitor: V) -> Result<Value, V::Error>
86             where
87                 V: SeqAccess<'de>,
88             {
89                 let mut vec = Vec::new();
90 
91                 while let Some(elem) = tri!(visitor.next_element()) {
92                     vec.push(elem);
93                 }
94 
95                 Ok(Value::Array(vec))
96             }
97 
98             #[cfg(any(feature = "std", feature = "alloc"))]
99             fn visit_map<V>(self, mut visitor: V) -> Result<Value, V::Error>
100             where
101                 V: MapAccess<'de>,
102             {
103                 match visitor.next_key_seed(KeyClassifier)? {
104                     #[cfg(feature = "arbitrary_precision")]
105                     Some(KeyClass::Number) => {
106                         let number: NumberFromString = visitor.next_value()?;
107                         Ok(Value::Number(number.value))
108                     }
109                     #[cfg(feature = "raw_value")]
110                     Some(KeyClass::RawValue) => {
111                         let value = visitor.next_value_seed(crate::raw::BoxedFromString)?;
112                         crate::from_str(value.get()).map_err(de::Error::custom)
113                     }
114                     Some(KeyClass::Map(first_key)) => {
115                         let mut values = Map::new();
116 
117                         values.insert(first_key, tri!(visitor.next_value()));
118                         while let Some((key, value)) = tri!(visitor.next_entry()) {
119                             values.insert(key, value);
120                         }
121 
122                         Ok(Value::Object(values))
123                     }
124                     None => Ok(Value::Object(Map::new())),
125                 }
126             }
127         }
128 
129         deserializer.deserialize_any(ValueVisitor)
130     }
131 }
132 
133 impl FromStr for Value {
134     type Err = Error;
from_str(s: &str) -> Result<Value, Error>135     fn from_str(s: &str) -> Result<Value, Error> {
136         super::super::de::from_str(s)
137     }
138 }
139 
140 macro_rules! deserialize_number {
141     ($method:ident) => {
142         #[cfg(not(feature = "arbitrary_precision"))]
143         fn $method<V>(self, visitor: V) -> Result<V::Value, Error>
144         where
145             V: Visitor<'de>,
146         {
147             match self {
148                 Value::Number(n) => n.deserialize_any(visitor),
149                 _ => Err(self.invalid_type(&visitor)),
150             }
151         }
152 
153         #[cfg(feature = "arbitrary_precision")]
154         fn $method<V>(self, visitor: V) -> Result<V::Value, Error>
155         where
156             V: Visitor<'de>,
157         {
158             match self {
159                 Value::Number(n) => n.$method(visitor),
160                 _ => self.deserialize_any(visitor),
161             }
162         }
163     };
164 }
165 
visit_array<'de, V>(array: Vec<Value>, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,166 fn visit_array<'de, V>(array: Vec<Value>, visitor: V) -> Result<V::Value, Error>
167 where
168     V: Visitor<'de>,
169 {
170     let len = array.len();
171     let mut deserializer = SeqDeserializer::new(array);
172     let seq = tri!(visitor.visit_seq(&mut deserializer));
173     let remaining = deserializer.iter.len();
174     if remaining == 0 {
175         Ok(seq)
176     } else {
177         Err(serde::de::Error::invalid_length(
178             len,
179             &"fewer elements in array",
180         ))
181     }
182 }
183 
visit_object<'de, V>(object: Map<String, Value>, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,184 fn visit_object<'de, V>(object: Map<String, Value>, visitor: V) -> Result<V::Value, Error>
185 where
186     V: Visitor<'de>,
187 {
188     let len = object.len();
189     let mut deserializer = MapDeserializer::new(object);
190     let map = tri!(visitor.visit_map(&mut deserializer));
191     let remaining = deserializer.iter.len();
192     if remaining == 0 {
193         Ok(map)
194     } else {
195         Err(serde::de::Error::invalid_length(
196             len,
197             &"fewer elements in map",
198         ))
199     }
200 }
201 
202 impl<'de> serde::Deserializer<'de> for Value {
203     type Error = Error;
204 
205     #[inline]
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,206     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
207     where
208         V: Visitor<'de>,
209     {
210         match self {
211             Value::Null => visitor.visit_unit(),
212             Value::Bool(v) => visitor.visit_bool(v),
213             Value::Number(n) => n.deserialize_any(visitor),
214             #[cfg(any(feature = "std", feature = "alloc"))]
215             Value::String(v) => visitor.visit_string(v),
216             Value::Array(v) => visit_array(v, visitor),
217             Value::Object(v) => visit_object(v, visitor),
218         }
219     }
220 
221     deserialize_number!(deserialize_i8);
222     deserialize_number!(deserialize_i16);
223     deserialize_number!(deserialize_i32);
224     deserialize_number!(deserialize_i64);
225     deserialize_number!(deserialize_u8);
226     deserialize_number!(deserialize_u16);
227     deserialize_number!(deserialize_u32);
228     deserialize_number!(deserialize_u64);
229     deserialize_number!(deserialize_f32);
230     deserialize_number!(deserialize_f64);
231 
232     serde_if_integer128! {
233         deserialize_number!(deserialize_i128);
234         deserialize_number!(deserialize_u128);
235     }
236 
237     #[inline]
deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,238     fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
239     where
240         V: Visitor<'de>,
241     {
242         match self {
243             Value::Null => visitor.visit_none(),
244             _ => visitor.visit_some(self),
245         }
246     }
247 
248     #[inline]
deserialize_enum<V>( self, _name: &str, _variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Error> where V: Visitor<'de>,249     fn deserialize_enum<V>(
250         self,
251         _name: &str,
252         _variants: &'static [&'static str],
253         visitor: V,
254     ) -> Result<V::Value, Error>
255     where
256         V: Visitor<'de>,
257     {
258         let (variant, value) = match self {
259             Value::Object(value) => {
260                 let mut iter = value.into_iter();
261                 let (variant, value) = match iter.next() {
262                     Some(v) => v,
263                     None => {
264                         return Err(serde::de::Error::invalid_value(
265                             Unexpected::Map,
266                             &"map with a single key",
267                         ));
268                     }
269                 };
270                 // enums are encoded in json as maps with a single key:value pair
271                 if iter.next().is_some() {
272                     return Err(serde::de::Error::invalid_value(
273                         Unexpected::Map,
274                         &"map with a single key",
275                     ));
276                 }
277                 (variant, Some(value))
278             }
279             Value::String(variant) => (variant, None),
280             other => {
281                 return Err(serde::de::Error::invalid_type(
282                     other.unexpected(),
283                     &"string or map",
284                 ));
285             }
286         };
287 
288         visitor.visit_enum(EnumDeserializer { variant, value })
289     }
290 
291     #[inline]
deserialize_newtype_struct<V>( self, name: &'static str, visitor: V, ) -> Result<V::Value, Error> where V: Visitor<'de>,292     fn deserialize_newtype_struct<V>(
293         self,
294         name: &'static str,
295         visitor: V,
296     ) -> Result<V::Value, Error>
297     where
298         V: Visitor<'de>,
299     {
300         #[cfg(feature = "raw_value")]
301         {
302             if name == crate::raw::TOKEN {
303                 return visitor.visit_map(crate::raw::OwnedRawDeserializer {
304                     raw_value: Some(self.to_string()),
305                 });
306             }
307         }
308 
309         let _ = name;
310         visitor.visit_newtype_struct(self)
311     }
312 
deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,313     fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Error>
314     where
315         V: Visitor<'de>,
316     {
317         match self {
318             Value::Bool(v) => visitor.visit_bool(v),
319             _ => Err(self.invalid_type(&visitor)),
320         }
321     }
322 
deserialize_char<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,323     fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Error>
324     where
325         V: Visitor<'de>,
326     {
327         self.deserialize_string(visitor)
328     }
329 
deserialize_str<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,330     fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Error>
331     where
332         V: Visitor<'de>,
333     {
334         self.deserialize_string(visitor)
335     }
336 
deserialize_string<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,337     fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Error>
338     where
339         V: Visitor<'de>,
340     {
341         match self {
342             #[cfg(any(feature = "std", feature = "alloc"))]
343             Value::String(v) => visitor.visit_string(v),
344             _ => Err(self.invalid_type(&visitor)),
345         }
346     }
347 
deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,348     fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Error>
349     where
350         V: Visitor<'de>,
351     {
352         self.deserialize_byte_buf(visitor)
353     }
354 
deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,355     fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Error>
356     where
357         V: Visitor<'de>,
358     {
359         match self {
360             #[cfg(any(feature = "std", feature = "alloc"))]
361             Value::String(v) => visitor.visit_string(v),
362             Value::Array(v) => visit_array(v, visitor),
363             _ => Err(self.invalid_type(&visitor)),
364         }
365     }
366 
deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,367     fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Error>
368     where
369         V: Visitor<'de>,
370     {
371         match self {
372             Value::Null => visitor.visit_unit(),
373             _ => Err(self.invalid_type(&visitor)),
374         }
375     }
376 
deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,377     fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value, Error>
378     where
379         V: Visitor<'de>,
380     {
381         self.deserialize_unit(visitor)
382     }
383 
deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,384     fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Error>
385     where
386         V: Visitor<'de>,
387     {
388         match self {
389             Value::Array(v) => visit_array(v, visitor),
390             _ => Err(self.invalid_type(&visitor)),
391         }
392     }
393 
deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,394     fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error>
395     where
396         V: Visitor<'de>,
397     {
398         self.deserialize_seq(visitor)
399     }
400 
deserialize_tuple_struct<V>( self, _name: &'static str, _len: usize, visitor: V, ) -> Result<V::Value, Error> where V: Visitor<'de>,401     fn deserialize_tuple_struct<V>(
402         self,
403         _name: &'static str,
404         _len: usize,
405         visitor: V,
406     ) -> Result<V::Value, Error>
407     where
408         V: Visitor<'de>,
409     {
410         self.deserialize_seq(visitor)
411     }
412 
deserialize_map<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,413     fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Error>
414     where
415         V: Visitor<'de>,
416     {
417         match self {
418             Value::Object(v) => visit_object(v, visitor),
419             _ => Err(self.invalid_type(&visitor)),
420         }
421     }
422 
deserialize_struct<V>( self, _name: &'static str, _fields: &'static [&'static str], visitor: V, ) -> Result<V::Value, Error> where V: Visitor<'de>,423     fn deserialize_struct<V>(
424         self,
425         _name: &'static str,
426         _fields: &'static [&'static str],
427         visitor: V,
428     ) -> Result<V::Value, Error>
429     where
430         V: Visitor<'de>,
431     {
432         match self {
433             Value::Array(v) => visit_array(v, visitor),
434             Value::Object(v) => visit_object(v, visitor),
435             _ => Err(self.invalid_type(&visitor)),
436         }
437     }
438 
deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,439     fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Error>
440     where
441         V: Visitor<'de>,
442     {
443         self.deserialize_string(visitor)
444     }
445 
deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,446     fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error>
447     where
448         V: Visitor<'de>,
449     {
450         drop(self);
451         visitor.visit_unit()
452     }
453 }
454 
455 struct EnumDeserializer {
456     variant: String,
457     value: Option<Value>,
458 }
459 
460 impl<'de> EnumAccess<'de> for EnumDeserializer {
461     type Error = Error;
462     type Variant = VariantDeserializer;
463 
variant_seed<V>(self, seed: V) -> Result<(V::Value, VariantDeserializer), Error> where V: DeserializeSeed<'de>,464     fn variant_seed<V>(self, seed: V) -> Result<(V::Value, VariantDeserializer), Error>
465     where
466         V: DeserializeSeed<'de>,
467     {
468         let variant = self.variant.into_deserializer();
469         let visitor = VariantDeserializer { value: self.value };
470         seed.deserialize(variant).map(|v| (v, visitor))
471     }
472 }
473 
474 impl<'de> IntoDeserializer<'de, Error> for Value {
475     type Deserializer = Self;
476 
into_deserializer(self) -> Self::Deserializer477     fn into_deserializer(self) -> Self::Deserializer {
478         self
479     }
480 }
481 
482 struct VariantDeserializer {
483     value: Option<Value>,
484 }
485 
486 impl<'de> VariantAccess<'de> for VariantDeserializer {
487     type Error = Error;
488 
unit_variant(self) -> Result<(), Error>489     fn unit_variant(self) -> Result<(), Error> {
490         match self.value {
491             Some(value) => Deserialize::deserialize(value),
492             None => Ok(()),
493         }
494     }
495 
newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Error> where T: DeserializeSeed<'de>,496     fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Error>
497     where
498         T: DeserializeSeed<'de>,
499     {
500         match self.value {
501             Some(value) => seed.deserialize(value),
502             None => Err(serde::de::Error::invalid_type(
503                 Unexpected::UnitVariant,
504                 &"newtype variant",
505             )),
506         }
507     }
508 
tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,509     fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error>
510     where
511         V: Visitor<'de>,
512     {
513         match self.value {
514             Some(Value::Array(v)) => {
515                 serde::Deserializer::deserialize_any(SeqDeserializer::new(v), visitor)
516             }
517             Some(other) => Err(serde::de::Error::invalid_type(
518                 other.unexpected(),
519                 &"tuple variant",
520             )),
521             None => Err(serde::de::Error::invalid_type(
522                 Unexpected::UnitVariant,
523                 &"tuple variant",
524             )),
525         }
526     }
527 
struct_variant<V>( self, _fields: &'static [&'static str], visitor: V, ) -> Result<V::Value, Error> where V: Visitor<'de>,528     fn struct_variant<V>(
529         self,
530         _fields: &'static [&'static str],
531         visitor: V,
532     ) -> Result<V::Value, Error>
533     where
534         V: Visitor<'de>,
535     {
536         match self.value {
537             Some(Value::Object(v)) => {
538                 serde::Deserializer::deserialize_any(MapDeserializer::new(v), visitor)
539             }
540             Some(other) => Err(serde::de::Error::invalid_type(
541                 other.unexpected(),
542                 &"struct variant",
543             )),
544             None => Err(serde::de::Error::invalid_type(
545                 Unexpected::UnitVariant,
546                 &"struct variant",
547             )),
548         }
549     }
550 }
551 
552 struct SeqDeserializer {
553     iter: vec::IntoIter<Value>,
554 }
555 
556 impl SeqDeserializer {
new(vec: Vec<Value>) -> Self557     fn new(vec: Vec<Value>) -> Self {
558         SeqDeserializer {
559             iter: vec.into_iter(),
560         }
561     }
562 }
563 
564 impl<'de> serde::Deserializer<'de> for SeqDeserializer {
565     type Error = Error;
566 
567     #[inline]
deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,568     fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Error>
569     where
570         V: Visitor<'de>,
571     {
572         let len = self.iter.len();
573         if len == 0 {
574             visitor.visit_unit()
575         } else {
576             let ret = tri!(visitor.visit_seq(&mut self));
577             let remaining = self.iter.len();
578             if remaining == 0 {
579                 Ok(ret)
580             } else {
581                 Err(serde::de::Error::invalid_length(
582                     len,
583                     &"fewer elements in array",
584                 ))
585             }
586         }
587     }
588 
589     forward_to_deserialize_any! {
590         bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
591         bytes byte_buf option unit unit_struct newtype_struct seq tuple
592         tuple_struct map struct enum identifier ignored_any
593     }
594 }
595 
596 impl<'de> SeqAccess<'de> for SeqDeserializer {
597     type Error = Error;
598 
next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error> where T: DeserializeSeed<'de>,599     fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
600     where
601         T: DeserializeSeed<'de>,
602     {
603         match self.iter.next() {
604             Some(value) => seed.deserialize(value).map(Some),
605             None => Ok(None),
606         }
607     }
608 
size_hint(&self) -> Option<usize>609     fn size_hint(&self) -> Option<usize> {
610         match self.iter.size_hint() {
611             (lower, Some(upper)) if lower == upper => Some(upper),
612             _ => None,
613         }
614     }
615 }
616 
617 struct MapDeserializer {
618     iter: <Map<String, Value> as IntoIterator>::IntoIter,
619     value: Option<Value>,
620 }
621 
622 impl MapDeserializer {
new(map: Map<String, Value>) -> Self623     fn new(map: Map<String, Value>) -> Self {
624         MapDeserializer {
625             iter: map.into_iter(),
626             value: None,
627         }
628     }
629 }
630 
631 impl<'de> MapAccess<'de> for MapDeserializer {
632     type Error = Error;
633 
next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error> where T: DeserializeSeed<'de>,634     fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
635     where
636         T: DeserializeSeed<'de>,
637     {
638         match self.iter.next() {
639             Some((key, value)) => {
640                 self.value = Some(value);
641                 let key_de = MapKeyDeserializer {
642                     key: Cow::Owned(key),
643                 };
644                 seed.deserialize(key_de).map(Some)
645             }
646             None => Ok(None),
647         }
648     }
649 
next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Error> where T: DeserializeSeed<'de>,650     fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Error>
651     where
652         T: DeserializeSeed<'de>,
653     {
654         match self.value.take() {
655             Some(value) => seed.deserialize(value),
656             None => Err(serde::de::Error::custom("value is missing")),
657         }
658     }
659 
size_hint(&self) -> Option<usize>660     fn size_hint(&self) -> Option<usize> {
661         match self.iter.size_hint() {
662             (lower, Some(upper)) if lower == upper => Some(upper),
663             _ => None,
664         }
665     }
666 }
667 
668 impl<'de> serde::Deserializer<'de> for MapDeserializer {
669     type Error = Error;
670 
671     #[inline]
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,672     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
673     where
674         V: Visitor<'de>,
675     {
676         visitor.visit_map(self)
677     }
678 
679     forward_to_deserialize_any! {
680         bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
681         bytes byte_buf option unit unit_struct newtype_struct seq tuple
682         tuple_struct map struct enum identifier ignored_any
683     }
684 }
685 
686 macro_rules! deserialize_value_ref_number {
687     ($method:ident) => {
688         #[cfg(not(feature = "arbitrary_precision"))]
689         fn $method<V>(self, visitor: V) -> Result<V::Value, Error>
690         where
691             V: Visitor<'de>,
692         {
693             match *self {
694                 Value::Number(ref n) => n.deserialize_any(visitor),
695                 _ => Err(self.invalid_type(&visitor)),
696             }
697         }
698 
699         #[cfg(feature = "arbitrary_precision")]
700         fn $method<V>(self, visitor: V) -> Result<V::Value, Error>
701         where
702             V: Visitor<'de>,
703         {
704             match *self {
705                 Value::Number(ref n) => n.$method(visitor),
706                 _ => self.deserialize_any(visitor),
707             }
708         }
709     };
710 }
711 
visit_array_ref<'de, V>(array: &'de [Value], visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,712 fn visit_array_ref<'de, V>(array: &'de [Value], visitor: V) -> Result<V::Value, Error>
713 where
714     V: Visitor<'de>,
715 {
716     let len = array.len();
717     let mut deserializer = SeqRefDeserializer::new(array);
718     let seq = tri!(visitor.visit_seq(&mut deserializer));
719     let remaining = deserializer.iter.len();
720     if remaining == 0 {
721         Ok(seq)
722     } else {
723         Err(serde::de::Error::invalid_length(
724             len,
725             &"fewer elements in array",
726         ))
727     }
728 }
729 
visit_object_ref<'de, V>(object: &'de Map<String, Value>, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,730 fn visit_object_ref<'de, V>(object: &'de Map<String, Value>, visitor: V) -> Result<V::Value, Error>
731 where
732     V: Visitor<'de>,
733 {
734     let len = object.len();
735     let mut deserializer = MapRefDeserializer::new(object);
736     let map = tri!(visitor.visit_map(&mut deserializer));
737     let remaining = deserializer.iter.len();
738     if remaining == 0 {
739         Ok(map)
740     } else {
741         Err(serde::de::Error::invalid_length(
742             len,
743             &"fewer elements in map",
744         ))
745     }
746 }
747 
748 impl<'de> serde::Deserializer<'de> for &'de Value {
749     type Error = Error;
750 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,751     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
752     where
753         V: Visitor<'de>,
754     {
755         match *self {
756             Value::Null => visitor.visit_unit(),
757             Value::Bool(v) => visitor.visit_bool(v),
758             Value::Number(ref n) => n.deserialize_any(visitor),
759             Value::String(ref v) => visitor.visit_borrowed_str(v),
760             Value::Array(ref v) => visit_array_ref(v, visitor),
761             Value::Object(ref v) => visit_object_ref(v, visitor),
762         }
763     }
764 
765     deserialize_value_ref_number!(deserialize_i8);
766     deserialize_value_ref_number!(deserialize_i16);
767     deserialize_value_ref_number!(deserialize_i32);
768     deserialize_value_ref_number!(deserialize_i64);
769     deserialize_value_ref_number!(deserialize_u8);
770     deserialize_value_ref_number!(deserialize_u16);
771     deserialize_value_ref_number!(deserialize_u32);
772     deserialize_value_ref_number!(deserialize_u64);
773     deserialize_value_ref_number!(deserialize_f32);
774     deserialize_value_ref_number!(deserialize_f64);
775 
776     serde_if_integer128! {
777         deserialize_number!(deserialize_i128);
778         deserialize_number!(deserialize_u128);
779     }
780 
deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,781     fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
782     where
783         V: Visitor<'de>,
784     {
785         match *self {
786             Value::Null => visitor.visit_none(),
787             _ => visitor.visit_some(self),
788         }
789     }
790 
deserialize_enum<V>( self, _name: &str, _variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Error> where V: Visitor<'de>,791     fn deserialize_enum<V>(
792         self,
793         _name: &str,
794         _variants: &'static [&'static str],
795         visitor: V,
796     ) -> Result<V::Value, Error>
797     where
798         V: Visitor<'de>,
799     {
800         let (variant, value) = match *self {
801             Value::Object(ref value) => {
802                 let mut iter = value.into_iter();
803                 let (variant, value) = match iter.next() {
804                     Some(v) => v,
805                     None => {
806                         return Err(serde::de::Error::invalid_value(
807                             Unexpected::Map,
808                             &"map with a single key",
809                         ));
810                     }
811                 };
812                 // enums are encoded in json as maps with a single key:value pair
813                 if iter.next().is_some() {
814                     return Err(serde::de::Error::invalid_value(
815                         Unexpected::Map,
816                         &"map with a single key",
817                     ));
818                 }
819                 (variant, Some(value))
820             }
821             Value::String(ref variant) => (variant, None),
822             ref other => {
823                 return Err(serde::de::Error::invalid_type(
824                     other.unexpected(),
825                     &"string or map",
826                 ));
827             }
828         };
829 
830         visitor.visit_enum(EnumRefDeserializer { variant, value })
831     }
832 
833     #[inline]
deserialize_newtype_struct<V>( self, name: &'static str, visitor: V, ) -> Result<V::Value, Error> where V: Visitor<'de>,834     fn deserialize_newtype_struct<V>(
835         self,
836         name: &'static str,
837         visitor: V,
838     ) -> Result<V::Value, Error>
839     where
840         V: Visitor<'de>,
841     {
842         #[cfg(feature = "raw_value")]
843         {
844             if name == crate::raw::TOKEN {
845                 return visitor.visit_map(crate::raw::OwnedRawDeserializer {
846                     raw_value: Some(self.to_string()),
847                 });
848             }
849         }
850 
851         let _ = name;
852         visitor.visit_newtype_struct(self)
853     }
854 
deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,855     fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Error>
856     where
857         V: Visitor<'de>,
858     {
859         match *self {
860             Value::Bool(v) => visitor.visit_bool(v),
861             _ => Err(self.invalid_type(&visitor)),
862         }
863     }
864 
deserialize_char<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,865     fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Error>
866     where
867         V: Visitor<'de>,
868     {
869         self.deserialize_str(visitor)
870     }
871 
deserialize_str<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,872     fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Error>
873     where
874         V: Visitor<'de>,
875     {
876         match *self {
877             Value::String(ref v) => visitor.visit_borrowed_str(v),
878             _ => Err(self.invalid_type(&visitor)),
879         }
880     }
881 
deserialize_string<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,882     fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Error>
883     where
884         V: Visitor<'de>,
885     {
886         self.deserialize_str(visitor)
887     }
888 
deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,889     fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Error>
890     where
891         V: Visitor<'de>,
892     {
893         match *self {
894             Value::String(ref v) => visitor.visit_borrowed_str(v),
895             Value::Array(ref v) => visit_array_ref(v, visitor),
896             _ => Err(self.invalid_type(&visitor)),
897         }
898     }
899 
deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,900     fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Error>
901     where
902         V: Visitor<'de>,
903     {
904         self.deserialize_bytes(visitor)
905     }
906 
deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,907     fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Error>
908     where
909         V: Visitor<'de>,
910     {
911         match *self {
912             Value::Null => visitor.visit_unit(),
913             _ => Err(self.invalid_type(&visitor)),
914         }
915     }
916 
deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,917     fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value, Error>
918     where
919         V: Visitor<'de>,
920     {
921         self.deserialize_unit(visitor)
922     }
923 
deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,924     fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Error>
925     where
926         V: Visitor<'de>,
927     {
928         match *self {
929             Value::Array(ref v) => visit_array_ref(v, visitor),
930             _ => Err(self.invalid_type(&visitor)),
931         }
932     }
933 
deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,934     fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error>
935     where
936         V: Visitor<'de>,
937     {
938         self.deserialize_seq(visitor)
939     }
940 
deserialize_tuple_struct<V>( self, _name: &'static str, _len: usize, visitor: V, ) -> Result<V::Value, Error> where V: Visitor<'de>,941     fn deserialize_tuple_struct<V>(
942         self,
943         _name: &'static str,
944         _len: usize,
945         visitor: V,
946     ) -> Result<V::Value, Error>
947     where
948         V: Visitor<'de>,
949     {
950         self.deserialize_seq(visitor)
951     }
952 
deserialize_map<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,953     fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Error>
954     where
955         V: Visitor<'de>,
956     {
957         match *self {
958             Value::Object(ref v) => visit_object_ref(v, visitor),
959             _ => Err(self.invalid_type(&visitor)),
960         }
961     }
962 
deserialize_struct<V>( self, _name: &'static str, _fields: &'static [&'static str], visitor: V, ) -> Result<V::Value, Error> where V: Visitor<'de>,963     fn deserialize_struct<V>(
964         self,
965         _name: &'static str,
966         _fields: &'static [&'static str],
967         visitor: V,
968     ) -> Result<V::Value, Error>
969     where
970         V: Visitor<'de>,
971     {
972         match *self {
973             Value::Array(ref v) => visit_array_ref(v, visitor),
974             Value::Object(ref v) => visit_object_ref(v, visitor),
975             _ => Err(self.invalid_type(&visitor)),
976         }
977     }
978 
deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,979     fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Error>
980     where
981         V: Visitor<'de>,
982     {
983         self.deserialize_str(visitor)
984     }
985 
deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,986     fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error>
987     where
988         V: Visitor<'de>,
989     {
990         visitor.visit_unit()
991     }
992 }
993 
994 struct EnumRefDeserializer<'de> {
995     variant: &'de str,
996     value: Option<&'de Value>,
997 }
998 
999 impl<'de> EnumAccess<'de> for EnumRefDeserializer<'de> {
1000     type Error = Error;
1001     type Variant = VariantRefDeserializer<'de>;
1002 
variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Error> where V: DeserializeSeed<'de>,1003     fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Error>
1004     where
1005         V: DeserializeSeed<'de>,
1006     {
1007         let variant = self.variant.into_deserializer();
1008         let visitor = VariantRefDeserializer { value: self.value };
1009         seed.deserialize(variant).map(|v| (v, visitor))
1010     }
1011 }
1012 
1013 struct VariantRefDeserializer<'de> {
1014     value: Option<&'de Value>,
1015 }
1016 
1017 impl<'de> VariantAccess<'de> for VariantRefDeserializer<'de> {
1018     type Error = Error;
1019 
unit_variant(self) -> Result<(), Error>1020     fn unit_variant(self) -> Result<(), Error> {
1021         match self.value {
1022             Some(value) => Deserialize::deserialize(value),
1023             None => Ok(()),
1024         }
1025     }
1026 
newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Error> where T: DeserializeSeed<'de>,1027     fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Error>
1028     where
1029         T: DeserializeSeed<'de>,
1030     {
1031         match self.value {
1032             Some(value) => seed.deserialize(value),
1033             None => Err(serde::de::Error::invalid_type(
1034                 Unexpected::UnitVariant,
1035                 &"newtype variant",
1036             )),
1037         }
1038     }
1039 
tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,1040     fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error>
1041     where
1042         V: Visitor<'de>,
1043     {
1044         match self.value {
1045             Some(&Value::Array(ref v)) => {
1046                 serde::Deserializer::deserialize_any(SeqRefDeserializer::new(v), visitor)
1047             }
1048             Some(other) => Err(serde::de::Error::invalid_type(
1049                 other.unexpected(),
1050                 &"tuple variant",
1051             )),
1052             None => Err(serde::de::Error::invalid_type(
1053                 Unexpected::UnitVariant,
1054                 &"tuple variant",
1055             )),
1056         }
1057     }
1058 
struct_variant<V>( self, _fields: &'static [&'static str], visitor: V, ) -> Result<V::Value, Error> where V: Visitor<'de>,1059     fn struct_variant<V>(
1060         self,
1061         _fields: &'static [&'static str],
1062         visitor: V,
1063     ) -> Result<V::Value, Error>
1064     where
1065         V: Visitor<'de>,
1066     {
1067         match self.value {
1068             Some(&Value::Object(ref v)) => {
1069                 serde::Deserializer::deserialize_any(MapRefDeserializer::new(v), visitor)
1070             }
1071             Some(other) => Err(serde::de::Error::invalid_type(
1072                 other.unexpected(),
1073                 &"struct variant",
1074             )),
1075             None => Err(serde::de::Error::invalid_type(
1076                 Unexpected::UnitVariant,
1077                 &"struct variant",
1078             )),
1079         }
1080     }
1081 }
1082 
1083 struct SeqRefDeserializer<'de> {
1084     iter: slice::Iter<'de, Value>,
1085 }
1086 
1087 impl<'de> SeqRefDeserializer<'de> {
new(slice: &'de [Value]) -> Self1088     fn new(slice: &'de [Value]) -> Self {
1089         SeqRefDeserializer { iter: slice.iter() }
1090     }
1091 }
1092 
1093 impl<'de> serde::Deserializer<'de> for SeqRefDeserializer<'de> {
1094     type Error = Error;
1095 
1096     #[inline]
deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,1097     fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Error>
1098     where
1099         V: Visitor<'de>,
1100     {
1101         let len = self.iter.len();
1102         if len == 0 {
1103             visitor.visit_unit()
1104         } else {
1105             let ret = tri!(visitor.visit_seq(&mut self));
1106             let remaining = self.iter.len();
1107             if remaining == 0 {
1108                 Ok(ret)
1109             } else {
1110                 Err(serde::de::Error::invalid_length(
1111                     len,
1112                     &"fewer elements in array",
1113                 ))
1114             }
1115         }
1116     }
1117 
1118     forward_to_deserialize_any! {
1119         bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
1120         bytes byte_buf option unit unit_struct newtype_struct seq tuple
1121         tuple_struct map struct enum identifier ignored_any
1122     }
1123 }
1124 
1125 impl<'de> SeqAccess<'de> for SeqRefDeserializer<'de> {
1126     type Error = Error;
1127 
next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error> where T: DeserializeSeed<'de>,1128     fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
1129     where
1130         T: DeserializeSeed<'de>,
1131     {
1132         match self.iter.next() {
1133             Some(value) => seed.deserialize(value).map(Some),
1134             None => Ok(None),
1135         }
1136     }
1137 
size_hint(&self) -> Option<usize>1138     fn size_hint(&self) -> Option<usize> {
1139         match self.iter.size_hint() {
1140             (lower, Some(upper)) if lower == upper => Some(upper),
1141             _ => None,
1142         }
1143     }
1144 }
1145 
1146 struct MapRefDeserializer<'de> {
1147     iter: <&'de Map<String, Value> as IntoIterator>::IntoIter,
1148     value: Option<&'de Value>,
1149 }
1150 
1151 impl<'de> MapRefDeserializer<'de> {
new(map: &'de Map<String, Value>) -> Self1152     fn new(map: &'de Map<String, Value>) -> Self {
1153         MapRefDeserializer {
1154             iter: map.into_iter(),
1155             value: None,
1156         }
1157     }
1158 }
1159 
1160 impl<'de> MapAccess<'de> for MapRefDeserializer<'de> {
1161     type Error = Error;
1162 
next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error> where T: DeserializeSeed<'de>,1163     fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
1164     where
1165         T: DeserializeSeed<'de>,
1166     {
1167         match self.iter.next() {
1168             Some((key, value)) => {
1169                 self.value = Some(value);
1170                 let key_de = MapKeyDeserializer {
1171                     key: Cow::Borrowed(&**key),
1172                 };
1173                 seed.deserialize(key_de).map(Some)
1174             }
1175             None => Ok(None),
1176         }
1177     }
1178 
next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Error> where T: DeserializeSeed<'de>,1179     fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Error>
1180     where
1181         T: DeserializeSeed<'de>,
1182     {
1183         match self.value.take() {
1184             Some(value) => seed.deserialize(value),
1185             None => Err(serde::de::Error::custom("value is missing")),
1186         }
1187     }
1188 
size_hint(&self) -> Option<usize>1189     fn size_hint(&self) -> Option<usize> {
1190         match self.iter.size_hint() {
1191             (lower, Some(upper)) if lower == upper => Some(upper),
1192             _ => None,
1193         }
1194     }
1195 }
1196 
1197 impl<'de> serde::Deserializer<'de> for MapRefDeserializer<'de> {
1198     type Error = Error;
1199 
1200     #[inline]
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,1201     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
1202     where
1203         V: Visitor<'de>,
1204     {
1205         visitor.visit_map(self)
1206     }
1207 
1208     forward_to_deserialize_any! {
1209         bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
1210         bytes byte_buf option unit unit_struct newtype_struct seq tuple
1211         tuple_struct map struct enum identifier ignored_any
1212     }
1213 }
1214 
1215 struct MapKeyDeserializer<'de> {
1216     key: Cow<'de, str>,
1217 }
1218 
1219 macro_rules! deserialize_integer_key {
1220     ($method:ident => $visit:ident) => {
1221         fn $method<V>(self, visitor: V) -> Result<V::Value, Error>
1222         where
1223             V: Visitor<'de>,
1224         {
1225             match (self.key.parse(), self.key) {
1226                 (Ok(integer), _) => visitor.$visit(integer),
1227                 (Err(_), Cow::Borrowed(s)) => visitor.visit_borrowed_str(s),
1228                 #[cfg(any(feature = "std", feature = "alloc"))]
1229                 (Err(_), Cow::Owned(s)) => visitor.visit_string(s),
1230             }
1231         }
1232     };
1233 }
1234 
1235 impl<'de> serde::Deserializer<'de> for MapKeyDeserializer<'de> {
1236     type Error = Error;
1237 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,1238     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
1239     where
1240         V: Visitor<'de>,
1241     {
1242         BorrowedCowStrDeserializer::new(self.key).deserialize_any(visitor)
1243     }
1244 
1245     deserialize_integer_key!(deserialize_i8 => visit_i8);
1246     deserialize_integer_key!(deserialize_i16 => visit_i16);
1247     deserialize_integer_key!(deserialize_i32 => visit_i32);
1248     deserialize_integer_key!(deserialize_i64 => visit_i64);
1249     deserialize_integer_key!(deserialize_u8 => visit_u8);
1250     deserialize_integer_key!(deserialize_u16 => visit_u16);
1251     deserialize_integer_key!(deserialize_u32 => visit_u32);
1252     deserialize_integer_key!(deserialize_u64 => visit_u64);
1253 
1254     serde_if_integer128! {
1255         deserialize_integer_key!(deserialize_i128 => visit_i128);
1256         deserialize_integer_key!(deserialize_u128 => visit_u128);
1257     }
1258 
1259     #[inline]
deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,1260     fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
1261     where
1262         V: Visitor<'de>,
1263     {
1264         // Map keys cannot be null.
1265         visitor.visit_some(self)
1266     }
1267 
1268     #[inline]
deserialize_newtype_struct<V>( self, _name: &'static str, visitor: V, ) -> Result<V::Value, Error> where V: Visitor<'de>,1269     fn deserialize_newtype_struct<V>(
1270         self,
1271         _name: &'static str,
1272         visitor: V,
1273     ) -> Result<V::Value, Error>
1274     where
1275         V: Visitor<'de>,
1276     {
1277         visitor.visit_newtype_struct(self)
1278     }
1279 
deserialize_enum<V>( self, name: &'static str, variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Error> where V: Visitor<'de>,1280     fn deserialize_enum<V>(
1281         self,
1282         name: &'static str,
1283         variants: &'static [&'static str],
1284         visitor: V,
1285     ) -> Result<V::Value, Error>
1286     where
1287         V: Visitor<'de>,
1288     {
1289         self.key
1290             .into_deserializer()
1291             .deserialize_enum(name, variants, visitor)
1292     }
1293 
1294     forward_to_deserialize_any! {
1295         bool f32 f64 char str string bytes byte_buf unit unit_struct seq tuple
1296         tuple_struct map struct identifier ignored_any
1297     }
1298 }
1299 
1300 struct KeyClassifier;
1301 
1302 enum KeyClass {
1303     Map(String),
1304     #[cfg(feature = "arbitrary_precision")]
1305     Number,
1306     #[cfg(feature = "raw_value")]
1307     RawValue,
1308 }
1309 
1310 impl<'de> DeserializeSeed<'de> for KeyClassifier {
1311     type Value = KeyClass;
1312 
deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: serde::Deserializer<'de>,1313     fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
1314     where
1315         D: serde::Deserializer<'de>,
1316     {
1317         deserializer.deserialize_str(self)
1318     }
1319 }
1320 
1321 impl<'de> Visitor<'de> for KeyClassifier {
1322     type Value = KeyClass;
1323 
expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result1324     fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1325         formatter.write_str("a string key")
1326     }
1327 
visit_str<E>(self, s: &str) -> Result<Self::Value, E> where E: de::Error,1328     fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
1329     where
1330         E: de::Error,
1331     {
1332         match s {
1333             #[cfg(feature = "arbitrary_precision")]
1334             crate::number::TOKEN => Ok(KeyClass::Number),
1335             #[cfg(feature = "raw_value")]
1336             crate::raw::TOKEN => Ok(KeyClass::RawValue),
1337             _ => Ok(KeyClass::Map(s.to_owned())),
1338         }
1339     }
1340 
1341     #[cfg(any(feature = "std", feature = "alloc"))]
visit_string<E>(self, s: String) -> Result<Self::Value, E> where E: de::Error,1342     fn visit_string<E>(self, s: String) -> Result<Self::Value, E>
1343     where
1344         E: de::Error,
1345     {
1346         match s.as_str() {
1347             #[cfg(feature = "arbitrary_precision")]
1348             crate::number::TOKEN => Ok(KeyClass::Number),
1349             #[cfg(feature = "raw_value")]
1350             crate::raw::TOKEN => Ok(KeyClass::RawValue),
1351             _ => Ok(KeyClass::Map(s)),
1352         }
1353     }
1354 }
1355 
1356 impl Value {
1357     #[cold]
invalid_type<E>(&self, exp: &dyn Expected) -> E where E: serde::de::Error,1358     fn invalid_type<E>(&self, exp: &dyn Expected) -> E
1359     where
1360         E: serde::de::Error,
1361     {
1362         serde::de::Error::invalid_type(self.unexpected(), exp)
1363     }
1364 
1365     #[cold]
unexpected(&self) -> Unexpected1366     fn unexpected(&self) -> Unexpected {
1367         match *self {
1368             Value::Null => Unexpected::Unit,
1369             Value::Bool(b) => Unexpected::Bool(b),
1370             Value::Number(ref n) => n.unexpected(),
1371             Value::String(ref s) => Unexpected::Str(s),
1372             Value::Array(_) => Unexpected::Seq,
1373             Value::Object(_) => Unexpected::Map,
1374         }
1375     }
1376 }
1377 
1378 struct BorrowedCowStrDeserializer<'de> {
1379     value: Cow<'de, str>,
1380 }
1381 
1382 impl<'de> BorrowedCowStrDeserializer<'de> {
new(value: Cow<'de, str>) -> Self1383     fn new(value: Cow<'de, str>) -> Self {
1384         BorrowedCowStrDeserializer { value }
1385     }
1386 }
1387 
1388 impl<'de> de::Deserializer<'de> for BorrowedCowStrDeserializer<'de> {
1389     type Error = Error;
1390 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error> where V: de::Visitor<'de>,1391     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
1392     where
1393         V: de::Visitor<'de>,
1394     {
1395         match self.value {
1396             Cow::Borrowed(string) => visitor.visit_borrowed_str(string),
1397             #[cfg(any(feature = "std", feature = "alloc"))]
1398             Cow::Owned(string) => visitor.visit_string(string),
1399         }
1400     }
1401 
deserialize_enum<V>( self, _name: &str, _variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Error> where V: de::Visitor<'de>,1402     fn deserialize_enum<V>(
1403         self,
1404         _name: &str,
1405         _variants: &'static [&'static str],
1406         visitor: V,
1407     ) -> Result<V::Value, Error>
1408     where
1409         V: de::Visitor<'de>,
1410     {
1411         visitor.visit_enum(self)
1412     }
1413 
1414     forward_to_deserialize_any! {
1415         bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
1416         bytes byte_buf option unit unit_struct newtype_struct seq tuple
1417         tuple_struct map struct identifier ignored_any
1418     }
1419 }
1420 
1421 impl<'de> de::EnumAccess<'de> for BorrowedCowStrDeserializer<'de> {
1422     type Error = Error;
1423     type Variant = UnitOnly;
1424 
variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Error> where T: de::DeserializeSeed<'de>,1425     fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Error>
1426     where
1427         T: de::DeserializeSeed<'de>,
1428     {
1429         let value = seed.deserialize(self)?;
1430         Ok((value, UnitOnly))
1431     }
1432 }
1433 
1434 struct UnitOnly;
1435 
1436 impl<'de> de::VariantAccess<'de> for UnitOnly {
1437     type Error = Error;
1438 
unit_variant(self) -> Result<(), Error>1439     fn unit_variant(self) -> Result<(), Error> {
1440         Ok(())
1441     }
1442 
newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value, Error> where T: de::DeserializeSeed<'de>,1443     fn newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value, Error>
1444     where
1445         T: de::DeserializeSeed<'de>,
1446     {
1447         Err(de::Error::invalid_type(
1448             Unexpected::UnitVariant,
1449             &"newtype variant",
1450         ))
1451     }
1452 
tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value, Error> where V: de::Visitor<'de>,1453     fn tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value, Error>
1454     where
1455         V: de::Visitor<'de>,
1456     {
1457         Err(de::Error::invalid_type(
1458             Unexpected::UnitVariant,
1459             &"tuple variant",
1460         ))
1461     }
1462 
struct_variant<V>( self, _fields: &'static [&'static str], _visitor: V, ) -> Result<V::Value, Error> where V: de::Visitor<'de>,1463     fn struct_variant<V>(
1464         self,
1465         _fields: &'static [&'static str],
1466         _visitor: V,
1467     ) -> Result<V::Value, Error>
1468     where
1469         V: de::Visitor<'de>,
1470     {
1471         Err(de::Error::invalid_type(
1472             Unexpected::UnitVariant,
1473             &"struct variant",
1474         ))
1475     }
1476 }
1477