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