serde_json/value/
de.rs

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