1use crate::value::tagged::{self, TagStringVisitor};
2use crate::value::TaggedValue;
3use crate::{number, Error, Mapping, Sequence, Value};
4use serde::de::value::{BorrowedStrDeserializer, StrDeserializer};
5use serde::de::{
6 self, Deserialize, DeserializeSeed, Deserializer, EnumAccess, Error as _, Expected, MapAccess,
7 SeqAccess, Unexpected, VariantAccess, Visitor,
8};
9use serde::forward_to_deserialize_any;
10use std::fmt;
11use std::slice;
12use std::vec;
13
14impl<'de> Deserialize<'de> for Value {
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
123impl Value {
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
135fn visit_sequence<'de, V>(sequence: Sequence, visitor: V) -> Result<V::Value, Error>
136where
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
150fn visit_sequence_ref<'de, V>(sequence: &'de Sequence, visitor: V) -> Result<V::Value, Error>
151where
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
165fn visit_mapping<'de, V>(mapping: Mapping, visitor: V) -> Result<V::Value, Error>
166where
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
180fn visit_mapping_ref<'de, V>(mapping: &'de Mapping, visitor: V) -> Result<V::Value, Error>
181where
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
195impl<'de> Deserializer<'de> for Value {
196 type Error = Error;
197
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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>(
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
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
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
490struct EnumDeserializer<'a> {
491 tag: &'a str,
492 value: Option<Value>,
493}
494
495impl<'a, 'de> EnumAccess<'de> for EnumDeserializer<'a> {
496 type Error = Error;
497 type Variant = VariantDeserializer;
498
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
510struct VariantDeserializer {
511 value: Option<Value>,
512}
513
514impl<'de> VariantAccess<'de> for VariantDeserializer {
515 type Error = Error;
516
517 fn unit_variant(self) -> Result<(), Error> {
518 match self.value {
519 Some(value) => value.unit_variant(),
520 None => Ok(()),
521 }
522 }
523
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
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
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
568pub(crate) struct SeqDeserializer {
569 iter: vec::IntoIter<Value>,
570}
571
572impl SeqDeserializer {
573 pub(crate) fn new(vec: Vec<Value>) -> Self {
574 SeqDeserializer {
575 iter: vec.into_iter(),
576 }
577 }
578}
579
580impl<'de> Deserializer<'de> for SeqDeserializer {
581 type Error = Error;
582
583 #[inline]
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
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
617impl<'de> SeqAccess<'de> for SeqDeserializer {
618 type Error = Error;
619
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
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
638pub(crate) struct MapDeserializer {
639 iter: <Mapping as IntoIterator>::IntoIter,
640 value: Option<Value>,
641}
642
643impl MapDeserializer {
644 pub(crate) fn new(map: Mapping) -> Self {
645 MapDeserializer {
646 iter: map.into_iter(),
647 value: None,
648 }
649 }
650}
651
652impl<'de> MapAccess<'de> for MapDeserializer {
653 type Error = Error;
654
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
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
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
686impl<'de> Deserializer<'de> for MapDeserializer {
687 type Error = Error;
688
689 #[inline]
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
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
712impl<'de> Deserializer<'de> for &'de Value {
713 type Error = Error;
714
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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(
981 other.unexpected(),
982 &"a Value::Tagged enum",
983 ));
984 }
985 })
986 }
987
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
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
1003struct EnumRefDeserializer<'de> {
1004 tag: &'de str,
1005 value: Option<&'de Value>,
1006}
1007
1008impl<'de> EnumAccess<'de> for EnumRefDeserializer<'de> {
1009 type Error = Error;
1010 type Variant = VariantRefDeserializer<'de>;
1011
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
1023struct VariantRefDeserializer<'de> {
1024 value: Option<&'de Value>,
1025}
1026
1027impl<'de> VariantAccess<'de> for VariantRefDeserializer<'de> {
1028 type Error = Error;
1029
1030 fn unit_variant(self) -> Result<(), Error> {
1031 match self.value {
1032 Some(value) => value.unit_variant(),
1033 None => Ok(()),
1034 }
1035 }
1036
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
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
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
1081pub(crate) struct SeqRefDeserializer<'de> {
1082 iter: slice::Iter<'de, Value>,
1083}
1084
1085impl<'de> SeqRefDeserializer<'de> {
1086 pub(crate) fn new(slice: &'de [Value]) -> Self {
1087 SeqRefDeserializer { iter: slice.iter() }
1088 }
1089}
1090
1091impl<'de> Deserializer<'de> for SeqRefDeserializer<'de> {
1092 type Error = Error;
1093
1094 #[inline]
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
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
1127impl<'de> SeqAccess<'de> for SeqRefDeserializer<'de> {
1128 type Error = Error;
1129
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
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
1148pub(crate) struct MapRefDeserializer<'de> {
1149 iter: Option<<&'de Mapping as IntoIterator>::IntoIter>,
1150 value: Option<&'de Value>,
1151}
1152
1153impl<'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
1162impl<'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
1196impl<'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
1221impl 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}