Skip to main content

serde_yaml/value/
de.rs

1use std::{fmt, slice, vec};
2
3use serde::{
4    de::{
5        self, Deserialize, DeserializeSeed, Deserializer, EnumAccess, Error as _, Expected, MapAccess, SeqAccess,
6        Unexpected, VariantAccess, Visitor,
7        value::{BorrowedStrDeserializer, StrDeserializer},
8    },
9    forward_to_deserialize_any,
10};
11
12use crate::{
13    Error, Mapping, Sequence, Value, number,
14    value::{
15        TaggedValue,
16        tagged::{self, TagStringVisitor},
17    },
18};
19
20impl<'de> Deserialize<'de> for Value {
21    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
22    where
23        D: Deserializer<'de>,
24    {
25        struct ValueVisitor;
26
27        impl<'de> Visitor<'de> for ValueVisitor {
28            type Value = Value;
29
30            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
31                formatter.write_str("any YAML value")
32            }
33
34            fn visit_bool<E>(self, b: bool) -> Result<Value, E>
35            where
36                E: de::Error,
37            {
38                Ok(Value::Bool(b))
39            }
40
41            fn visit_i64<E>(self, i: i64) -> Result<Value, E>
42            where
43                E: de::Error,
44            {
45                Ok(Value::Number(i.into()))
46            }
47
48            fn visit_u64<E>(self, u: u64) -> Result<Value, E>
49            where
50                E: de::Error,
51            {
52                Ok(Value::Number(u.into()))
53            }
54
55            fn visit_f64<E>(self, f: f64) -> Result<Value, E>
56            where
57                E: de::Error,
58            {
59                Ok(Value::Number(f.into()))
60            }
61
62            fn visit_str<E>(self, s: &str) -> Result<Value, E>
63            where
64                E: de::Error,
65            {
66                Ok(Value::String(s.to_owned()))
67            }
68
69            fn visit_string<E>(self, s: String) -> Result<Value, E>
70            where
71                E: de::Error,
72            {
73                Ok(Value::String(s))
74            }
75
76            fn visit_unit<E>(self) -> Result<Value, E>
77            where
78                E: de::Error,
79            {
80                Ok(Value::Null)
81            }
82
83            fn visit_none<E>(self) -> Result<Value, E>
84            where
85                E: de::Error,
86            {
87                Ok(Value::Null)
88            }
89
90            fn visit_some<D>(self, deserializer: D) -> Result<Value, D::Error>
91            where
92                D: Deserializer<'de>,
93            {
94                Deserialize::deserialize(deserializer)
95            }
96
97            fn visit_seq<A>(self, data: A) -> Result<Value, A::Error>
98            where
99                A: SeqAccess<'de>,
100            {
101                let de = serde::de::value::SeqAccessDeserializer::new(data);
102                let sequence = Sequence::deserialize(de)?;
103                Ok(Value::Sequence(sequence))
104            }
105
106            fn visit_map<A>(self, data: A) -> Result<Value, A::Error>
107            where
108                A: MapAccess<'de>,
109            {
110                let de = serde::de::value::MapAccessDeserializer::new(data);
111                let mapping = Mapping::deserialize(de)?;
112                Ok(Value::Mapping(mapping))
113            }
114
115            fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>
116            where
117                A: EnumAccess<'de>,
118            {
119                let (tag, contents) = data.variant_seed(TagStringVisitor)?;
120                let value = contents.newtype_variant()?;
121                Ok(Value::Tagged(Box::new(TaggedValue {
122                    tag,
123                    value,
124                })))
125            }
126        }
127
128        deserializer.deserialize_any(ValueVisitor)
129    }
130}
131
132impl Value {
133    fn deserialize_number<'de, V>(&self, visitor: V) -> Result<V::Value, Error>
134    where
135        V: Visitor<'de>,
136    {
137        match self.untag_ref() {
138            Value::Number(n) => n.deserialize_any(visitor),
139            other => Err(other.invalid_type(&visitor)),
140        }
141    }
142}
143
144fn visit_sequence<'de, V>(sequence: Sequence, visitor: V) -> Result<V::Value, Error>
145where
146    V: Visitor<'de>,
147{
148    let len = sequence.len();
149    let mut deserializer = SeqDeserializer::new(sequence);
150    let seq = visitor.visit_seq(&mut deserializer)?;
151    let remaining = deserializer.iter.len();
152    if remaining == 0 {
153        Ok(seq)
154    } else {
155        Err(Error::invalid_length(len, &"fewer elements in sequence"))
156    }
157}
158
159fn visit_sequence_ref<'de, V>(sequence: &'de Sequence, visitor: V) -> Result<V::Value, Error>
160where
161    V: Visitor<'de>,
162{
163    let len = sequence.len();
164    let mut deserializer = SeqRefDeserializer::new(sequence);
165    let seq = visitor.visit_seq(&mut deserializer)?;
166    let remaining = deserializer.iter.len();
167    if remaining == 0 {
168        Ok(seq)
169    } else {
170        Err(Error::invalid_length(len, &"fewer elements in sequence"))
171    }
172}
173
174fn visit_mapping<'de, V>(mapping: Mapping, visitor: V) -> Result<V::Value, Error>
175where
176    V: Visitor<'de>,
177{
178    let len = mapping.len();
179    let mut deserializer = MapDeserializer::new(mapping);
180    let map = visitor.visit_map(&mut deserializer)?;
181    let remaining = deserializer.iter.len();
182    if remaining == 0 {
183        Ok(map)
184    } else {
185        Err(Error::invalid_length(len, &"fewer elements in map"))
186    }
187}
188
189fn visit_mapping_ref<'de, V>(mapping: &'de Mapping, visitor: V) -> Result<V::Value, Error>
190where
191    V: Visitor<'de>,
192{
193    let len = mapping.len();
194    let mut deserializer = MapRefDeserializer::new(mapping);
195    let map = visitor.visit_map(&mut deserializer)?;
196    let remaining = deserializer.iter.unwrap().len();
197    if remaining == 0 {
198        Ok(map)
199    } else {
200        Err(Error::invalid_length(len, &"fewer elements in map"))
201    }
202}
203
204impl<'de> Deserializer<'de> for Value {
205    type Error = Error;
206
207    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
208    where
209        V: Visitor<'de>,
210    {
211        match self {
212            Value::Null => visitor.visit_unit(),
213            Value::Bool(v) => visitor.visit_bool(v),
214            Value::Number(n) => n.deserialize_any(visitor),
215            Value::String(v) => visitor.visit_string(v),
216            Value::Sequence(v) => visit_sequence(v, visitor),
217            Value::Mapping(v) => visit_mapping(v, visitor),
218            Value::Tagged(tagged) => visitor.visit_enum(*tagged),
219        }
220    }
221
222    fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Error>
223    where
224        V: Visitor<'de>,
225    {
226        match self.untag() {
227            Value::Bool(v) => visitor.visit_bool(v),
228            other => Err(other.invalid_type(&visitor)),
229        }
230    }
231
232    fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Error>
233    where
234        V: Visitor<'de>,
235    {
236        self.deserialize_number(visitor)
237    }
238
239    fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Error>
240    where
241        V: Visitor<'de>,
242    {
243        self.deserialize_number(visitor)
244    }
245
246    fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Error>
247    where
248        V: Visitor<'de>,
249    {
250        self.deserialize_number(visitor)
251    }
252
253    fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Error>
254    where
255        V: Visitor<'de>,
256    {
257        self.deserialize_number(visitor)
258    }
259
260    fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value, Error>
261    where
262        V: Visitor<'de>,
263    {
264        self.deserialize_number(visitor)
265    }
266
267    fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Error>
268    where
269        V: Visitor<'de>,
270    {
271        self.deserialize_number(visitor)
272    }
273
274    fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Error>
275    where
276        V: Visitor<'de>,
277    {
278        self.deserialize_number(visitor)
279    }
280
281    fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Error>
282    where
283        V: Visitor<'de>,
284    {
285        self.deserialize_number(visitor)
286    }
287
288    fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Error>
289    where
290        V: Visitor<'de>,
291    {
292        self.deserialize_number(visitor)
293    }
294
295    fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value, Error>
296    where
297        V: Visitor<'de>,
298    {
299        self.deserialize_number(visitor)
300    }
301
302    fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Error>
303    where
304        V: Visitor<'de>,
305    {
306        self.deserialize_number(visitor)
307    }
308
309    fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Error>
310    where
311        V: Visitor<'de>,
312    {
313        self.deserialize_number(visitor)
314    }
315
316    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Error>
317    where
318        V: Visitor<'de>,
319    {
320        self.deserialize_string(visitor)
321    }
322
323    fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Error>
324    where
325        V: Visitor<'de>,
326    {
327        self.deserialize_string(visitor)
328    }
329
330    fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Error>
331    where
332        V: Visitor<'de>,
333    {
334        match self.untag() {
335            Value::String(v) => visitor.visit_string(v),
336            other => Err(other.invalid_type(&visitor)),
337        }
338    }
339
340    fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Error>
341    where
342        V: Visitor<'de>,
343    {
344        self.deserialize_byte_buf(visitor)
345    }
346
347    fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Error>
348    where
349        V: Visitor<'de>,
350    {
351        match self.untag() {
352            Value::String(v) => visitor.visit_string(v),
353            Value::Sequence(v) => visit_sequence(v, visitor),
354            other => Err(other.invalid_type(&visitor)),
355        }
356    }
357
358    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
359    where
360        V: Visitor<'de>,
361    {
362        match self {
363            Value::Null => visitor.visit_none(),
364            _ => visitor.visit_some(self),
365        }
366    }
367
368    fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Error>
369    where
370        V: Visitor<'de>,
371    {
372        match self {
373            Value::Null => visitor.visit_unit(),
374            _ => Err(self.invalid_type(&visitor)),
375        }
376    }
377
378    fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value, Error>
379    where
380        V: Visitor<'de>,
381    {
382        self.deserialize_unit(visitor)
383    }
384
385    fn deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value, Error>
386    where
387        V: Visitor<'de>,
388    {
389        visitor.visit_newtype_struct(self)
390    }
391
392    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Error>
393    where
394        V: Visitor<'de>,
395    {
396        match self.untag() {
397            Value::Sequence(v) => visit_sequence(v, visitor),
398            Value::Null => visit_sequence(Sequence::new(), visitor),
399            other => Err(other.invalid_type(&visitor)),
400        }
401    }
402
403    fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error>
404    where
405        V: Visitor<'de>,
406    {
407        self.deserialize_seq(visitor)
408    }
409
410    fn deserialize_tuple_struct<V>(self, _name: &'static str, _len: usize, visitor: V) -> Result<V::Value, Error>
411    where
412        V: Visitor<'de>,
413    {
414        self.deserialize_seq(visitor)
415    }
416
417    fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Error>
418    where
419        V: Visitor<'de>,
420    {
421        match self.untag() {
422            Value::Mapping(v) => visit_mapping(v, visitor),
423            Value::Null => visit_mapping(Mapping::new(), visitor),
424            other => Err(other.invalid_type(&visitor)),
425        }
426    }
427
428    fn deserialize_struct<V>(
429        self,
430        _name: &'static str,
431        _fields: &'static [&'static str],
432        visitor: V,
433    ) -> Result<V::Value, Error>
434    where
435        V: Visitor<'de>,
436    {
437        self.deserialize_map(visitor)
438    }
439
440    fn deserialize_enum<V>(self, _name: &str, _variants: &'static [&'static str], visitor: V) -> Result<V::Value, Error>
441    where
442        V: Visitor<'de>,
443    {
444        let tag;
445        visitor.visit_enum(match self {
446            Value::Tagged(tagged) => EnumDeserializer {
447                tag: {
448                    tag = tagged.tag.string;
449                    tagged::nobang(&tag)
450                },
451                value: Some(tagged.value),
452            },
453            Value::String(variant) => EnumDeserializer {
454                tag: {
455                    tag = variant;
456                    &tag
457                },
458                value: None,
459            },
460            other => {
461                return Err(Error::invalid_type(other.unexpected(), &"a Value::Tagged enum"));
462            }
463        })
464    }
465
466    fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Error>
467    where
468        V: Visitor<'de>,
469    {
470        self.deserialize_string(visitor)
471    }
472
473    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error>
474    where
475        V: Visitor<'de>,
476    {
477        drop(self);
478        visitor.visit_unit()
479    }
480}
481
482struct EnumDeserializer<'a> {
483    tag: &'a str,
484    value: Option<Value>,
485}
486
487impl<'a, 'de> EnumAccess<'de> for EnumDeserializer<'a> {
488    type Error = Error;
489    type Variant = VariantDeserializer;
490
491    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Error>
492    where
493        V: DeserializeSeed<'de>,
494    {
495        let str_de = StrDeserializer::<Error>::new(self.tag);
496        let variant = seed.deserialize(str_de)?;
497        let visitor = VariantDeserializer {
498            value: self.value,
499        };
500        Ok((variant, visitor))
501    }
502}
503
504struct VariantDeserializer {
505    value: Option<Value>,
506}
507
508impl<'de> VariantAccess<'de> for VariantDeserializer {
509    type Error = Error;
510
511    fn unit_variant(self) -> Result<(), Error> {
512        match self.value {
513            Some(value) => value.unit_variant(),
514            None => Ok(()),
515        }
516    }
517
518    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Error>
519    where
520        T: DeserializeSeed<'de>,
521    {
522        match self.value {
523            Some(value) => value.newtype_variant_seed(seed),
524            None => Err(Error::invalid_type(Unexpected::UnitVariant, &"newtype variant")),
525        }
526    }
527
528    fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, Error>
529    where
530        V: Visitor<'de>,
531    {
532        match self.value {
533            Some(value) => value.tuple_variant(len, visitor),
534            None => Err(Error::invalid_type(Unexpected::UnitVariant, &"tuple variant")),
535        }
536    }
537
538    fn struct_variant<V>(self, fields: &'static [&'static str], visitor: V) -> Result<V::Value, Error>
539    where
540        V: Visitor<'de>,
541    {
542        match self.value {
543            Some(value) => value.struct_variant(fields, visitor),
544            None => Err(Error::invalid_type(Unexpected::UnitVariant, &"struct variant")),
545        }
546    }
547}
548
549pub(crate) struct SeqDeserializer {
550    iter: vec::IntoIter<Value>,
551}
552
553impl SeqDeserializer {
554    pub(crate) fn new(vec: Vec<Value>) -> Self {
555        SeqDeserializer {
556            iter: vec.into_iter(),
557        }
558    }
559}
560
561impl<'de> Deserializer<'de> for SeqDeserializer {
562    type Error = Error;
563
564    #[inline]
565    fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Error>
566    where
567        V: Visitor<'de>,
568    {
569        let len = self.iter.len();
570        if len == 0 {
571            visitor.visit_unit()
572        } else {
573            let ret = visitor.visit_seq(&mut self)?;
574            let remaining = self.iter.len();
575            if remaining == 0 {
576                Ok(ret)
577            } else {
578                Err(Error::invalid_length(len, &"fewer elements in sequence"))
579            }
580        }
581    }
582
583    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error>
584    where
585        V: Visitor<'de>,
586    {
587        drop(self);
588        visitor.visit_unit()
589    }
590
591    forward_to_deserialize_any! {
592        bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes
593        byte_buf option unit unit_struct newtype_struct seq tuple tuple_struct
594        map struct enum identifier
595    }
596}
597
598impl<'de> SeqAccess<'de> for SeqDeserializer {
599    type Error = Error;
600
601    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
602    where
603        T: DeserializeSeed<'de>,
604    {
605        match self.iter.next() {
606            Some(value) => seed.deserialize(value).map(Some),
607            None => Ok(None),
608        }
609    }
610
611    fn size_hint(&self) -> Option<usize> {
612        match self.iter.size_hint() {
613            (lower, Some(upper)) if lower == upper => Some(upper),
614            _ => None,
615        }
616    }
617}
618
619pub(crate) struct MapDeserializer {
620    iter: <Mapping as IntoIterator>::IntoIter,
621    value: Option<Value>,
622}
623
624impl MapDeserializer {
625    pub(crate) fn new(map: Mapping) -> Self {
626        MapDeserializer {
627            iter: map.into_iter(),
628            value: None,
629        }
630    }
631}
632
633impl<'de> MapAccess<'de> for MapDeserializer {
634    type Error = Error;
635
636    fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
637    where
638        T: DeserializeSeed<'de>,
639    {
640        match self.iter.next() {
641            Some((key, value)) => {
642                self.value = Some(value);
643                seed.deserialize(key).map(Some)
644            }
645            None => Ok(None),
646        }
647    }
648
649    fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Error>
650    where
651        T: DeserializeSeed<'de>,
652    {
653        match self.value.take() {
654            Some(value) => seed.deserialize(value),
655            None => panic!("visit_value called before visit_key"),
656        }
657    }
658
659    fn size_hint(&self) -> Option<usize> {
660        match self.iter.size_hint() {
661            (lower, Some(upper)) if lower == upper => Some(upper),
662            _ => None,
663        }
664    }
665}
666
667impl<'de> Deserializer<'de> for MapDeserializer {
668    type Error = Error;
669
670    #[inline]
671    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
672    where
673        V: Visitor<'de>,
674    {
675        visitor.visit_map(self)
676    }
677
678    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error>
679    where
680        V: Visitor<'de>,
681    {
682        drop(self);
683        visitor.visit_unit()
684    }
685
686    forward_to_deserialize_any! {
687        bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes
688        byte_buf option unit unit_struct newtype_struct seq tuple tuple_struct
689        map struct enum identifier
690    }
691}
692
693impl<'de> Deserializer<'de> for &'de Value {
694    type Error = Error;
695
696    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
697    where
698        V: Visitor<'de>,
699    {
700        match self {
701            Value::Null => visitor.visit_unit(),
702            Value::Bool(v) => visitor.visit_bool(*v),
703            Value::Number(n) => n.deserialize_any(visitor),
704            Value::String(v) => visitor.visit_borrowed_str(v),
705            Value::Sequence(v) => visit_sequence_ref(v, visitor),
706            Value::Mapping(v) => visit_mapping_ref(v, visitor),
707            Value::Tagged(tagged) => visitor.visit_enum(&**tagged),
708        }
709    }
710
711    fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Error>
712    where
713        V: Visitor<'de>,
714    {
715        match self.untag_ref() {
716            Value::Bool(v) => visitor.visit_bool(*v),
717            other => Err(other.invalid_type(&visitor)),
718        }
719    }
720
721    fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Error>
722    where
723        V: Visitor<'de>,
724    {
725        self.deserialize_number(visitor)
726    }
727
728    fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Error>
729    where
730        V: Visitor<'de>,
731    {
732        self.deserialize_number(visitor)
733    }
734
735    fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Error>
736    where
737        V: Visitor<'de>,
738    {
739        self.deserialize_number(visitor)
740    }
741
742    fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Error>
743    where
744        V: Visitor<'de>,
745    {
746        self.deserialize_number(visitor)
747    }
748
749    fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value, Error>
750    where
751        V: Visitor<'de>,
752    {
753        self.deserialize_number(visitor)
754    }
755
756    fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Error>
757    where
758        V: Visitor<'de>,
759    {
760        self.deserialize_number(visitor)
761    }
762
763    fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Error>
764    where
765        V: Visitor<'de>,
766    {
767        self.deserialize_number(visitor)
768    }
769
770    fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Error>
771    where
772        V: Visitor<'de>,
773    {
774        self.deserialize_number(visitor)
775    }
776
777    fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Error>
778    where
779        V: Visitor<'de>,
780    {
781        self.deserialize_number(visitor)
782    }
783
784    fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value, Error>
785    where
786        V: Visitor<'de>,
787    {
788        self.deserialize_number(visitor)
789    }
790
791    fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Error>
792    where
793        V: Visitor<'de>,
794    {
795        self.deserialize_number(visitor)
796    }
797
798    fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Error>
799    where
800        V: Visitor<'de>,
801    {
802        self.deserialize_number(visitor)
803    }
804
805    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Error>
806    where
807        V: Visitor<'de>,
808    {
809        self.deserialize_string(visitor)
810    }
811
812    fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Error>
813    where
814        V: Visitor<'de>,
815    {
816        match self.untag_ref() {
817            Value::String(v) => visitor.visit_borrowed_str(v),
818            other => Err(other.invalid_type(&visitor)),
819        }
820    }
821
822    fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Error>
823    where
824        V: Visitor<'de>,
825    {
826        self.deserialize_str(visitor)
827    }
828
829    fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Error>
830    where
831        V: Visitor<'de>,
832    {
833        match self.untag_ref() {
834            Value::String(v) => visitor.visit_borrowed_str(v),
835            Value::Sequence(v) => visit_sequence_ref(v, visitor),
836            other => Err(other.invalid_type(&visitor)),
837        }
838    }
839
840    fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Error>
841    where
842        V: Visitor<'de>,
843    {
844        self.deserialize_bytes(visitor)
845    }
846
847    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
848    where
849        V: Visitor<'de>,
850    {
851        match self {
852            Value::Null => visitor.visit_none(),
853            _ => visitor.visit_some(self),
854        }
855    }
856
857    fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Error>
858    where
859        V: Visitor<'de>,
860    {
861        match self {
862            Value::Null => visitor.visit_unit(),
863            _ => Err(self.invalid_type(&visitor)),
864        }
865    }
866
867    fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value, Error>
868    where
869        V: Visitor<'de>,
870    {
871        self.deserialize_unit(visitor)
872    }
873
874    fn deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value, Error>
875    where
876        V: Visitor<'de>,
877    {
878        visitor.visit_newtype_struct(self)
879    }
880
881    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Error>
882    where
883        V: Visitor<'de>,
884    {
885        static EMPTY: Sequence = Sequence::new();
886        match self.untag_ref() {
887            Value::Sequence(v) => visit_sequence_ref(v, visitor),
888            Value::Null => visit_sequence_ref(&EMPTY, visitor),
889            other => Err(other.invalid_type(&visitor)),
890        }
891    }
892
893    fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error>
894    where
895        V: Visitor<'de>,
896    {
897        self.deserialize_seq(visitor)
898    }
899
900    fn deserialize_tuple_struct<V>(self, _name: &'static str, _len: usize, visitor: V) -> Result<V::Value, Error>
901    where
902        V: Visitor<'de>,
903    {
904        self.deserialize_seq(visitor)
905    }
906
907    fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Error>
908    where
909        V: Visitor<'de>,
910    {
911        match self.untag_ref() {
912            Value::Mapping(v) => visit_mapping_ref(v, visitor),
913            Value::Null => visitor.visit_map(&mut MapRefDeserializer {
914                iter: None,
915                value: None,
916            }),
917            other => Err(other.invalid_type(&visitor)),
918        }
919    }
920
921    fn deserialize_struct<V>(
922        self,
923        _name: &'static str,
924        _fields: &'static [&'static str],
925        visitor: V,
926    ) -> Result<V::Value, Error>
927    where
928        V: Visitor<'de>,
929    {
930        self.deserialize_map(visitor)
931    }
932
933    fn deserialize_enum<V>(self, _name: &str, _variants: &'static [&'static str], visitor: V) -> Result<V::Value, Error>
934    where
935        V: Visitor<'de>,
936    {
937        visitor.visit_enum(match self {
938            Value::Tagged(tagged) => EnumRefDeserializer {
939                tag: tagged::nobang(&tagged.tag.string),
940                value: Some(&tagged.value),
941            },
942            Value::String(variant) => EnumRefDeserializer {
943                tag: variant,
944                value: None,
945            },
946            other => {
947                return Err(Error::invalid_type(other.unexpected(), &"a Value::Tagged enum"));
948            }
949        })
950    }
951
952    fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Error>
953    where
954        V: Visitor<'de>,
955    {
956        self.deserialize_string(visitor)
957    }
958
959    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error>
960    where
961        V: Visitor<'de>,
962    {
963        visitor.visit_unit()
964    }
965}
966
967struct EnumRefDeserializer<'de> {
968    tag: &'de str,
969    value: Option<&'de Value>,
970}
971
972impl<'de> EnumAccess<'de> for EnumRefDeserializer<'de> {
973    type Error = Error;
974    type Variant = VariantRefDeserializer<'de>;
975
976    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Error>
977    where
978        V: DeserializeSeed<'de>,
979    {
980        let str_de = BorrowedStrDeserializer::<Error>::new(self.tag);
981        let variant = seed.deserialize(str_de)?;
982        let visitor = VariantRefDeserializer {
983            value: self.value,
984        };
985        Ok((variant, visitor))
986    }
987}
988
989struct VariantRefDeserializer<'de> {
990    value: Option<&'de Value>,
991}
992
993impl<'de> VariantAccess<'de> for VariantRefDeserializer<'de> {
994    type Error = Error;
995
996    fn unit_variant(self) -> Result<(), Error> {
997        match self.value {
998            Some(value) => value.unit_variant(),
999            None => Ok(()),
1000        }
1001    }
1002
1003    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Error>
1004    where
1005        T: DeserializeSeed<'de>,
1006    {
1007        match self.value {
1008            Some(value) => value.newtype_variant_seed(seed),
1009            None => Err(Error::invalid_type(Unexpected::UnitVariant, &"newtype variant")),
1010        }
1011    }
1012
1013    fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, Error>
1014    where
1015        V: Visitor<'de>,
1016    {
1017        match self.value {
1018            Some(value) => value.tuple_variant(len, visitor),
1019            None => Err(Error::invalid_type(Unexpected::UnitVariant, &"tuple variant")),
1020        }
1021    }
1022
1023    fn struct_variant<V>(self, fields: &'static [&'static str], visitor: V) -> Result<V::Value, Error>
1024    where
1025        V: Visitor<'de>,
1026    {
1027        match self.value {
1028            Some(value) => value.struct_variant(fields, visitor),
1029            None => Err(Error::invalid_type(Unexpected::UnitVariant, &"struct variant")),
1030        }
1031    }
1032}
1033
1034pub(crate) struct SeqRefDeserializer<'de> {
1035    iter: slice::Iter<'de, Value>,
1036}
1037
1038impl<'de> SeqRefDeserializer<'de> {
1039    pub(crate) fn new(slice: &'de [Value]) -> Self {
1040        SeqRefDeserializer {
1041            iter: slice.iter(),
1042        }
1043    }
1044}
1045
1046impl<'de> Deserializer<'de> for SeqRefDeserializer<'de> {
1047    type Error = Error;
1048
1049    #[inline]
1050    fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Error>
1051    where
1052        V: Visitor<'de>,
1053    {
1054        let len = self.iter.len();
1055        if len == 0 {
1056            visitor.visit_unit()
1057        } else {
1058            let ret = visitor.visit_seq(&mut self)?;
1059            let remaining = self.iter.len();
1060            if remaining == 0 {
1061                Ok(ret)
1062            } else {
1063                Err(Error::invalid_length(len, &"fewer elements in sequence"))
1064            }
1065        }
1066    }
1067
1068    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error>
1069    where
1070        V: Visitor<'de>,
1071    {
1072        visitor.visit_unit()
1073    }
1074
1075    forward_to_deserialize_any! {
1076        bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes
1077        byte_buf option unit unit_struct newtype_struct seq tuple tuple_struct
1078        map struct enum identifier
1079    }
1080}
1081
1082impl<'de> SeqAccess<'de> for SeqRefDeserializer<'de> {
1083    type Error = Error;
1084
1085    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
1086    where
1087        T: DeserializeSeed<'de>,
1088    {
1089        match self.iter.next() {
1090            Some(value) => seed.deserialize(value).map(Some),
1091            None => Ok(None),
1092        }
1093    }
1094
1095    fn size_hint(&self) -> Option<usize> {
1096        match self.iter.size_hint() {
1097            (lower, Some(upper)) if lower == upper => Some(upper),
1098            _ => None,
1099        }
1100    }
1101}
1102
1103pub(crate) struct MapRefDeserializer<'de> {
1104    iter: Option<<&'de Mapping as IntoIterator>::IntoIter>,
1105    value: Option<&'de Value>,
1106}
1107
1108impl<'de> MapRefDeserializer<'de> {
1109    pub(crate) fn new(map: &'de Mapping) -> Self {
1110        MapRefDeserializer {
1111            iter: Some(map.iter()),
1112            value: None,
1113        }
1114    }
1115}
1116
1117impl<'de> MapAccess<'de> for MapRefDeserializer<'de> {
1118    type Error = Error;
1119
1120    fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
1121    where
1122        T: DeserializeSeed<'de>,
1123    {
1124        match self.iter.as_mut().and_then(Iterator::next) {
1125            Some((key, value)) => {
1126                self.value = Some(value);
1127                seed.deserialize(key).map(Some)
1128            }
1129            None => Ok(None),
1130        }
1131    }
1132
1133    fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Error>
1134    where
1135        T: DeserializeSeed<'de>,
1136    {
1137        match self.value.take() {
1138            Some(value) => seed.deserialize(value),
1139            None => panic!("visit_value called before visit_key"),
1140        }
1141    }
1142
1143    fn size_hint(&self) -> Option<usize> {
1144        match self.iter.as_ref()?.size_hint() {
1145            (lower, Some(upper)) if lower == upper => Some(upper),
1146            _ => None,
1147        }
1148    }
1149}
1150
1151impl<'de> Deserializer<'de> for MapRefDeserializer<'de> {
1152    type Error = Error;
1153
1154    #[inline]
1155    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
1156    where
1157        V: Visitor<'de>,
1158    {
1159        visitor.visit_map(self)
1160    }
1161
1162    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error>
1163    where
1164        V: Visitor<'de>,
1165    {
1166        visitor.visit_unit()
1167    }
1168
1169    forward_to_deserialize_any! {
1170        bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes
1171        byte_buf option unit unit_struct newtype_struct seq tuple tuple_struct
1172        map struct enum identifier
1173    }
1174}
1175
1176impl Value {
1177    #[cold]
1178    fn invalid_type<E>(&self, exp: &dyn Expected) -> E
1179    where
1180        E: de::Error,
1181    {
1182        de::Error::invalid_type(self.unexpected(), exp)
1183    }
1184
1185    #[cold]
1186    pub(crate) fn unexpected(&self) -> Unexpected {
1187        match self {
1188            Value::Null => Unexpected::Unit,
1189            Value::Bool(b) => Unexpected::Bool(*b),
1190            Value::Number(n) => number::unexpected(n),
1191            Value::String(s) => Unexpected::Str(s),
1192            Value::Sequence(_) => Unexpected::Seq,
1193            Value::Mapping(_) => Unexpected::Map,
1194            Value::Tagged(_) => Unexpected::Enum,
1195        }
1196    }
1197}