serde_yaml/value/
de.rs

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