Skip to main content

serde_implicit/
content.rs

1// This module is private and nothing here should be used outside of
2// generated code.
3//
4// We will iterate on the implementation for a few releases and only have to
5// worry about backward compatibility for the `untagged` and `tag` attributes
6// rather than for this entire mechanism.
7//
8// This issue is tracking making some of this stuff public:
9// https://github.com/serde-rs/serde/issues/741
10
11use std::fmt;
12use std::marker::PhantomData;
13
14use serde::de::value::{MapDeserializer, SeqDeserializer};
15use serde::de::{
16    self, Deserialize, DeserializeSeed, Deserializer, EnumAccess, Expected, IgnoredAny, MapAccess,
17    SeqAccess, Unexpected, Visitor,
18};
19
20/// Used from generated code to buffer the contents of the Deserializer when
21/// deserializing untagged enums and internally tagged enums.
22///
23/// Not public API. Use serde-value instead.
24#[derive(Debug, Clone)]
25pub enum Content<'de> {
26    Bool(bool),
27
28    U8(u8),
29    U16(u16),
30    U32(u32),
31    U64(u64),
32
33    I8(i8),
34    I16(i16),
35    I32(i32),
36    I64(i64),
37
38    F32(f32),
39    F64(f64),
40
41    Char(char),
42    String(String),
43    Str(&'de str),
44    ByteBuf(Vec<u8>),
45    Bytes(&'de [u8]),
46
47    None,
48    Some(Box<Content<'de>>),
49
50    Unit,
51    Newtype(Box<Content<'de>>),
52    Seq(Vec<Content<'de>>),
53    Map(Vec<(Content<'de>, Content<'de>)>),
54}
55
56impl<'de> Content<'de> {
57    pub fn as_str(&self) -> Option<&str> {
58        match *self {
59            Content::Str(x) => Some(x),
60            Content::String(ref x) => Some(x),
61            Content::Bytes(x) => str::from_utf8(x).ok(),
62            Content::ByteBuf(ref x) => str::from_utf8(x).ok(),
63            _ => None,
64        }
65    }
66
67    #[cold]
68    fn unexpected(&self) -> Unexpected<'_> {
69        match *self {
70            Content::Bool(b) => Unexpected::Bool(b),
71            Content::U8(n) => Unexpected::Unsigned(n as u64),
72            Content::U16(n) => Unexpected::Unsigned(n as u64),
73            Content::U32(n) => Unexpected::Unsigned(n as u64),
74            Content::U64(n) => Unexpected::Unsigned(n),
75            Content::I8(n) => Unexpected::Signed(n as i64),
76            Content::I16(n) => Unexpected::Signed(n as i64),
77            Content::I32(n) => Unexpected::Signed(n as i64),
78            Content::I64(n) => Unexpected::Signed(n),
79            Content::F32(f) => Unexpected::Float(f as f64),
80            Content::F64(f) => Unexpected::Float(f),
81            Content::Char(c) => Unexpected::Char(c),
82            Content::String(ref s) => Unexpected::Str(s),
83            Content::Str(s) => Unexpected::Str(s),
84            Content::ByteBuf(ref b) => Unexpected::Bytes(b),
85            Content::Bytes(b) => Unexpected::Bytes(b),
86            Content::None | Content::Some(_) => Unexpected::Option,
87            Content::Unit => Unexpected::Unit,
88            Content::Newtype(_) => Unexpected::NewtypeStruct,
89            Content::Seq(_) => Unexpected::Seq,
90            Content::Map(_) => Unexpected::Map,
91        }
92    }
93}
94
95impl<'de> Deserialize<'de> for Content<'de> {
96    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
97    where
98        D: Deserializer<'de>,
99    {
100        // Untagged and internally tagged enums are only supported in
101        // self-describing formats.
102        let visitor = ContentVisitor { value: PhantomData };
103        deserializer.deserialize_any(visitor)
104    }
105}
106
107impl<'de, E> de::IntoDeserializer<'de, E> for Content<'de>
108where
109    E: de::Error,
110{
111    type Deserializer = ContentDeserializer<'de, E>;
112
113    fn into_deserializer(self) -> Self::Deserializer {
114        ContentDeserializer::new(self)
115    }
116}
117
118impl<'a, 'de, E> de::IntoDeserializer<'de, E> for &'a Content<'de>
119where
120    E: de::Error,
121{
122    type Deserializer = ContentRefDeserializer<'a, 'de, E>;
123
124    fn into_deserializer(self) -> Self::Deserializer {
125        ContentRefDeserializer::new(self)
126    }
127}
128
129/// Used to capture data in [`Content`] from other deserializers.
130/// Cannot capture externally tagged enums, `i128` and `u128`.
131struct ContentVisitor<'de> {
132    value: PhantomData<Content<'de>>,
133}
134
135impl<'de> ContentVisitor<'de> {
136    fn new() -> Self {
137        ContentVisitor { value: PhantomData }
138    }
139}
140
141macro_rules! tri {
142    ($e:expr) => {
143        $e?
144    };
145}
146
147macro_rules! map_key_integer_method {
148    (owned $name:ident, $visit:ident, $ty:ty) => {
149        fn $name<V>(self, visitor: V) -> Result<V::Value, Self::Error>
150        where
151            V: Visitor<'de>,
152        {
153            match self.content {
154                Content::String(ref s) => {
155                    if let Ok(v) = s.parse::<$ty>() {
156                        return visitor.$visit(v);
157                    }
158                }
159                Content::Str(s) => {
160                    if let Ok(v) = s.parse::<$ty>() {
161                        return visitor.$visit(v);
162                    }
163                }
164                _ => {}
165            }
166            ContentDeserializer::new(self.content).deserialize_integer(visitor)
167        }
168    };
169    (ref $name:ident, $visit:ident, $ty:ty) => {
170        fn $name<V>(self, visitor: V) -> Result<V::Value, Self::Error>
171        where
172            V: Visitor<'de>,
173        {
174            match *self.content {
175                Content::String(ref s) => {
176                    if let Ok(v) = s.parse::<$ty>() {
177                        return visitor.$visit(v);
178                    }
179                }
180                Content::Str(s) => {
181                    if let Ok(v) = s.parse::<$ty>() {
182                        return visitor.$visit(v);
183                    }
184                }
185                _ => {}
186            }
187            ContentRefDeserializer::new(self.content).deserialize_integer(visitor)
188        }
189    };
190}
191
192impl<'de> Visitor<'de> for ContentVisitor<'de> {
193    type Value = Content<'de>;
194
195    fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
196        fmt.write_str("any value")
197    }
198
199    fn visit_bool<F>(self, value: bool) -> Result<Self::Value, F>
200    where
201        F: de::Error,
202    {
203        Ok(Content::Bool(value))
204    }
205
206    fn visit_i8<F>(self, value: i8) -> Result<Self::Value, F>
207    where
208        F: de::Error,
209    {
210        Ok(Content::I8(value))
211    }
212
213    fn visit_i16<F>(self, value: i16) -> Result<Self::Value, F>
214    where
215        F: de::Error,
216    {
217        Ok(Content::I16(value))
218    }
219
220    fn visit_i32<F>(self, value: i32) -> Result<Self::Value, F>
221    where
222        F: de::Error,
223    {
224        Ok(Content::I32(value))
225    }
226
227    fn visit_i64<F>(self, value: i64) -> Result<Self::Value, F>
228    where
229        F: de::Error,
230    {
231        Ok(Content::I64(value))
232    }
233
234    fn visit_u8<F>(self, value: u8) -> Result<Self::Value, F>
235    where
236        F: de::Error,
237    {
238        Ok(Content::U8(value))
239    }
240
241    fn visit_u16<F>(self, value: u16) -> Result<Self::Value, F>
242    where
243        F: de::Error,
244    {
245        Ok(Content::U16(value))
246    }
247
248    fn visit_u32<F>(self, value: u32) -> Result<Self::Value, F>
249    where
250        F: de::Error,
251    {
252        Ok(Content::U32(value))
253    }
254
255    fn visit_u64<F>(self, value: u64) -> Result<Self::Value, F>
256    where
257        F: de::Error,
258    {
259        Ok(Content::U64(value))
260    }
261
262    fn visit_f32<F>(self, value: f32) -> Result<Self::Value, F>
263    where
264        F: de::Error,
265    {
266        Ok(Content::F32(value))
267    }
268
269    fn visit_f64<F>(self, value: f64) -> Result<Self::Value, F>
270    where
271        F: de::Error,
272    {
273        Ok(Content::F64(value))
274    }
275
276    fn visit_char<F>(self, value: char) -> Result<Self::Value, F>
277    where
278        F: de::Error,
279    {
280        Ok(Content::Char(value))
281    }
282
283    fn visit_str<F>(self, value: &str) -> Result<Self::Value, F>
284    where
285        F: de::Error,
286    {
287        Ok(Content::String(value.into()))
288    }
289
290    fn visit_borrowed_str<F>(self, value: &'de str) -> Result<Self::Value, F>
291    where
292        F: de::Error,
293    {
294        Ok(Content::Str(value))
295    }
296
297    fn visit_string<F>(self, value: String) -> Result<Self::Value, F>
298    where
299        F: de::Error,
300    {
301        Ok(Content::String(value))
302    }
303
304    fn visit_bytes<F>(self, value: &[u8]) -> Result<Self::Value, F>
305    where
306        F: de::Error,
307    {
308        Ok(Content::ByteBuf(value.into()))
309    }
310
311    fn visit_borrowed_bytes<F>(self, value: &'de [u8]) -> Result<Self::Value, F>
312    where
313        F: de::Error,
314    {
315        Ok(Content::Bytes(value))
316    }
317
318    fn visit_byte_buf<F>(self, value: Vec<u8>) -> Result<Self::Value, F>
319    where
320        F: de::Error,
321    {
322        Ok(Content::ByteBuf(value))
323    }
324
325    fn visit_unit<F>(self) -> Result<Self::Value, F>
326    where
327        F: de::Error,
328    {
329        Ok(Content::Unit)
330    }
331
332    fn visit_none<F>(self) -> Result<Self::Value, F>
333    where
334        F: de::Error,
335    {
336        Ok(Content::None)
337    }
338
339    fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
340    where
341        D: Deserializer<'de>,
342    {
343        let v = tri!(Deserialize::deserialize(deserializer));
344        Ok(Content::Some(Box::new(v)))
345    }
346
347    fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
348    where
349        D: Deserializer<'de>,
350    {
351        let v = tri!(Deserialize::deserialize(deserializer));
352        Ok(Content::Newtype(Box::new(v)))
353    }
354
355    fn visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
356    where
357        V: SeqAccess<'de>,
358    {
359        let mut vec = Vec::<Content>::with_capacity(visitor.size_hint().unwrap_or(0));
360        while let Some(e) = tri!(visitor.next_element()) {
361            vec.push(e);
362        }
363        Ok(Content::Seq(vec))
364    }
365
366    fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
367    where
368        V: MapAccess<'de>,
369    {
370        let mut vec = Vec::<(Content, Content)>::with_capacity(visitor.size_hint().unwrap_or(0));
371        while let Some(kv) = tri!(visitor.next_entry()) {
372            vec.push(kv);
373        }
374        Ok(Content::Map(vec))
375    }
376
377    fn visit_enum<V>(self, _visitor: V) -> Result<Self::Value, V::Error>
378    where
379        V: EnumAccess<'de>,
380    {
381        Err(de::Error::custom(
382            "untagged and internally tagged enums do not support enum input",
383        ))
384    }
385}
386
387/// This is the type of the map keys in an internally tagged enum.
388///
389/// Not public API.
390pub enum TagOrContent<'de> {
391    Tag,
392    Content(Content<'de>),
393}
394
395/// Serves as a seed for deserializing a key of internally tagged enum.
396/// Cannot capture externally tagged enums, `i128` and `u128`.
397struct TagOrContentVisitor<'de> {
398    name: &'static str,
399    value: PhantomData<TagOrContent<'de>>,
400}
401
402impl<'de> TagOrContentVisitor<'de> {
403    fn new(name: &'static str) -> Self {
404        TagOrContentVisitor {
405            name,
406            value: PhantomData,
407        }
408    }
409}
410
411impl<'de> DeserializeSeed<'de> for TagOrContentVisitor<'de> {
412    type Value = TagOrContent<'de>;
413
414    fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
415    where
416        D: Deserializer<'de>,
417    {
418        // Internally tagged enums are only supported in self-describing
419        // formats.
420        deserializer.deserialize_any(self)
421    }
422}
423
424impl<'de> Visitor<'de> for TagOrContentVisitor<'de> {
425    type Value = TagOrContent<'de>;
426
427    fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
428        write!(fmt, "a type tag `{}` or any other value", self.name)
429    }
430
431    fn visit_bool<F>(self, value: bool) -> Result<Self::Value, F>
432    where
433        F: de::Error,
434    {
435        ContentVisitor::new()
436            .visit_bool(value)
437            .map(TagOrContent::Content)
438    }
439
440    fn visit_i8<F>(self, value: i8) -> Result<Self::Value, F>
441    where
442        F: de::Error,
443    {
444        ContentVisitor::new()
445            .visit_i8(value)
446            .map(TagOrContent::Content)
447    }
448
449    fn visit_i16<F>(self, value: i16) -> Result<Self::Value, F>
450    where
451        F: de::Error,
452    {
453        ContentVisitor::new()
454            .visit_i16(value)
455            .map(TagOrContent::Content)
456    }
457
458    fn visit_i32<F>(self, value: i32) -> Result<Self::Value, F>
459    where
460        F: de::Error,
461    {
462        ContentVisitor::new()
463            .visit_i32(value)
464            .map(TagOrContent::Content)
465    }
466
467    fn visit_i64<F>(self, value: i64) -> Result<Self::Value, F>
468    where
469        F: de::Error,
470    {
471        ContentVisitor::new()
472            .visit_i64(value)
473            .map(TagOrContent::Content)
474    }
475
476    fn visit_u8<F>(self, value: u8) -> Result<Self::Value, F>
477    where
478        F: de::Error,
479    {
480        ContentVisitor::new()
481            .visit_u8(value)
482            .map(TagOrContent::Content)
483    }
484
485    fn visit_u16<F>(self, value: u16) -> Result<Self::Value, F>
486    where
487        F: de::Error,
488    {
489        ContentVisitor::new()
490            .visit_u16(value)
491            .map(TagOrContent::Content)
492    }
493
494    fn visit_u32<F>(self, value: u32) -> Result<Self::Value, F>
495    where
496        F: de::Error,
497    {
498        ContentVisitor::new()
499            .visit_u32(value)
500            .map(TagOrContent::Content)
501    }
502
503    fn visit_u64<F>(self, value: u64) -> Result<Self::Value, F>
504    where
505        F: de::Error,
506    {
507        ContentVisitor::new()
508            .visit_u64(value)
509            .map(TagOrContent::Content)
510    }
511
512    fn visit_f32<F>(self, value: f32) -> Result<Self::Value, F>
513    where
514        F: de::Error,
515    {
516        ContentVisitor::new()
517            .visit_f32(value)
518            .map(TagOrContent::Content)
519    }
520
521    fn visit_f64<F>(self, value: f64) -> Result<Self::Value, F>
522    where
523        F: de::Error,
524    {
525        ContentVisitor::new()
526            .visit_f64(value)
527            .map(TagOrContent::Content)
528    }
529
530    fn visit_char<F>(self, value: char) -> Result<Self::Value, F>
531    where
532        F: de::Error,
533    {
534        ContentVisitor::new()
535            .visit_char(value)
536            .map(TagOrContent::Content)
537    }
538
539    fn visit_str<F>(self, value: &str) -> Result<Self::Value, F>
540    where
541        F: de::Error,
542    {
543        if value == self.name {
544            Ok(TagOrContent::Tag)
545        } else {
546            ContentVisitor::new()
547                .visit_str(value)
548                .map(TagOrContent::Content)
549        }
550    }
551
552    fn visit_borrowed_str<F>(self, value: &'de str) -> Result<Self::Value, F>
553    where
554        F: de::Error,
555    {
556        if value == self.name {
557            Ok(TagOrContent::Tag)
558        } else {
559            ContentVisitor::new()
560                .visit_borrowed_str(value)
561                .map(TagOrContent::Content)
562        }
563    }
564
565    fn visit_string<F>(self, value: String) -> Result<Self::Value, F>
566    where
567        F: de::Error,
568    {
569        if value == self.name {
570            Ok(TagOrContent::Tag)
571        } else {
572            ContentVisitor::new()
573                .visit_string(value)
574                .map(TagOrContent::Content)
575        }
576    }
577
578    fn visit_bytes<F>(self, value: &[u8]) -> Result<Self::Value, F>
579    where
580        F: de::Error,
581    {
582        if value == self.name.as_bytes() {
583            Ok(TagOrContent::Tag)
584        } else {
585            ContentVisitor::new()
586                .visit_bytes(value)
587                .map(TagOrContent::Content)
588        }
589    }
590
591    fn visit_borrowed_bytes<F>(self, value: &'de [u8]) -> Result<Self::Value, F>
592    where
593        F: de::Error,
594    {
595        if value == self.name.as_bytes() {
596            Ok(TagOrContent::Tag)
597        } else {
598            ContentVisitor::new()
599                .visit_borrowed_bytes(value)
600                .map(TagOrContent::Content)
601        }
602    }
603
604    fn visit_byte_buf<F>(self, value: Vec<u8>) -> Result<Self::Value, F>
605    where
606        F: de::Error,
607    {
608        if value == self.name.as_bytes() {
609            Ok(TagOrContent::Tag)
610        } else {
611            ContentVisitor::new()
612                .visit_byte_buf(value)
613                .map(TagOrContent::Content)
614        }
615    }
616
617    fn visit_unit<F>(self) -> Result<Self::Value, F>
618    where
619        F: de::Error,
620    {
621        ContentVisitor::new()
622            .visit_unit()
623            .map(TagOrContent::Content)
624    }
625
626    fn visit_none<F>(self) -> Result<Self::Value, F>
627    where
628        F: de::Error,
629    {
630        ContentVisitor::new()
631            .visit_none()
632            .map(TagOrContent::Content)
633    }
634
635    fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
636    where
637        D: Deserializer<'de>,
638    {
639        ContentVisitor::new()
640            .visit_some(deserializer)
641            .map(TagOrContent::Content)
642    }
643
644    fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
645    where
646        D: Deserializer<'de>,
647    {
648        ContentVisitor::new()
649            .visit_newtype_struct(deserializer)
650            .map(TagOrContent::Content)
651    }
652
653    fn visit_seq<V>(self, visitor: V) -> Result<Self::Value, V::Error>
654    where
655        V: SeqAccess<'de>,
656    {
657        ContentVisitor::new()
658            .visit_seq(visitor)
659            .map(TagOrContent::Content)
660    }
661
662    fn visit_map<V>(self, visitor: V) -> Result<Self::Value, V::Error>
663    where
664        V: MapAccess<'de>,
665    {
666        ContentVisitor::new()
667            .visit_map(visitor)
668            .map(TagOrContent::Content)
669    }
670
671    fn visit_enum<V>(self, visitor: V) -> Result<Self::Value, V::Error>
672    where
673        V: EnumAccess<'de>,
674    {
675        ContentVisitor::new()
676            .visit_enum(visitor)
677            .map(TagOrContent::Content)
678    }
679}
680
681/// Used by generated code to deserialize an internally tagged enum.
682///
683/// Captures map or sequence from the original deserializer and searches
684/// a tag in it (in case of sequence, tag is the first element of sequence).
685///
686/// Not public API.
687pub struct TaggedContentVisitor<T> {
688    tag_name: &'static str,
689    expecting: &'static str,
690    value: PhantomData<T>,
691}
692
693impl<T> TaggedContentVisitor<T> {
694    /// Visitor for the content of an internally tagged enum with the given
695    /// tag name.
696    pub fn new(name: &'static str, expecting: &'static str) -> Self {
697        TaggedContentVisitor {
698            tag_name: name,
699            expecting,
700            value: PhantomData,
701        }
702    }
703}
704
705impl<'de, T> Visitor<'de> for TaggedContentVisitor<T>
706where
707    T: Deserialize<'de>,
708{
709    type Value = (T, Content<'de>);
710
711    fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
712        fmt.write_str(self.expecting)
713    }
714
715    fn visit_seq<S>(self, mut seq: S) -> Result<Self::Value, S::Error>
716    where
717        S: SeqAccess<'de>,
718    {
719        let tag = match tri!(seq.next_element()) {
720            Some(tag) => tag,
721            None => {
722                return Err(de::Error::missing_field(self.tag_name));
723            }
724        };
725        let rest = de::value::SeqAccessDeserializer::new(seq);
726        Ok((tag, tri!(Content::deserialize(rest))))
727    }
728
729    fn visit_map<M>(self, mut map: M) -> Result<Self::Value, M::Error>
730    where
731        M: MapAccess<'de>,
732    {
733        let mut tag = None;
734        let mut vec = Vec::<(Content, Content)>::with_capacity(map.size_hint().unwrap_or(0));
735        while let Some(k) = tri!(map.next_key_seed(TagOrContentVisitor::new(self.tag_name))) {
736            match k {
737                TagOrContent::Tag => {
738                    if tag.is_some() {
739                        return Err(de::Error::duplicate_field(self.tag_name));
740                    }
741                    tag = Some(tri!(map.next_value()));
742                }
743                TagOrContent::Content(k) => {
744                    let v = tri!(map.next_value());
745                    vec.push((k, v));
746                }
747            }
748        }
749        match tag {
750            None => Err(de::Error::missing_field(self.tag_name)),
751            Some(tag) => Ok((tag, Content::Map(vec))),
752        }
753    }
754}
755
756/// Used by generated code to deserialize an adjacently tagged enum.
757///
758/// Not public API.
759pub enum TagOrContentField {
760    Tag,
761    Content,
762}
763
764/// Not public API.
765pub struct TagOrContentFieldVisitor {
766    /// Name of the tag field of the adjacently tagged enum
767    pub tag: &'static str,
768    /// Name of the content field of the adjacently tagged enum
769    pub content: &'static str,
770}
771
772impl<'de> DeserializeSeed<'de> for TagOrContentFieldVisitor {
773    type Value = TagOrContentField;
774
775    fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
776    where
777        D: Deserializer<'de>,
778    {
779        deserializer.deserialize_identifier(self)
780    }
781}
782
783impl<'de> Visitor<'de> for TagOrContentFieldVisitor {
784    type Value = TagOrContentField;
785
786    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
787        write!(formatter, "{:?} or {:?}", self.tag, self.content)
788    }
789
790    fn visit_u64<E>(self, field_index: u64) -> Result<Self::Value, E>
791    where
792        E: de::Error,
793    {
794        match field_index {
795            0 => Ok(TagOrContentField::Tag),
796            1 => Ok(TagOrContentField::Content),
797            _ => Err(de::Error::invalid_value(
798                Unexpected::Unsigned(field_index),
799                &self,
800            )),
801        }
802    }
803
804    fn visit_str<E>(self, field: &str) -> Result<Self::Value, E>
805    where
806        E: de::Error,
807    {
808        if field == self.tag {
809            Ok(TagOrContentField::Tag)
810        } else if field == self.content {
811            Ok(TagOrContentField::Content)
812        } else {
813            Err(de::Error::invalid_value(Unexpected::Str(field), &self))
814        }
815    }
816
817    fn visit_bytes<E>(self, field: &[u8]) -> Result<Self::Value, E>
818    where
819        E: de::Error,
820    {
821        if field == self.tag.as_bytes() {
822            Ok(TagOrContentField::Tag)
823        } else if field == self.content.as_bytes() {
824            Ok(TagOrContentField::Content)
825        } else {
826            Err(de::Error::invalid_value(Unexpected::Bytes(field), &self))
827        }
828    }
829}
830
831/// Used by generated code to deserialize an adjacently tagged enum when
832/// ignoring unrelated fields is allowed.
833///
834/// Not public API.
835pub enum TagContentOtherField {
836    Tag,
837    Content,
838    Other,
839}
840
841/// Not public API.
842pub struct TagContentOtherFieldVisitor {
843    /// Name of the tag field of the adjacently tagged enum
844    pub tag: &'static str,
845    /// Name of the content field of the adjacently tagged enum
846    pub content: &'static str,
847}
848
849impl<'de> DeserializeSeed<'de> for TagContentOtherFieldVisitor {
850    type Value = TagContentOtherField;
851
852    fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
853    where
854        D: Deserializer<'de>,
855    {
856        deserializer.deserialize_identifier(self)
857    }
858}
859
860impl<'de> Visitor<'de> for TagContentOtherFieldVisitor {
861    type Value = TagContentOtherField;
862
863    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
864        write!(
865            formatter,
866            "{:?}, {:?}, or other ignored fields",
867            self.tag, self.content
868        )
869    }
870
871    fn visit_u64<E>(self, field_index: u64) -> Result<Self::Value, E>
872    where
873        E: de::Error,
874    {
875        match field_index {
876            0 => Ok(TagContentOtherField::Tag),
877            1 => Ok(TagContentOtherField::Content),
878            _ => Ok(TagContentOtherField::Other),
879        }
880    }
881
882    fn visit_str<E>(self, field: &str) -> Result<Self::Value, E>
883    where
884        E: de::Error,
885    {
886        self.visit_bytes(field.as_bytes())
887    }
888
889    fn visit_bytes<E>(self, field: &[u8]) -> Result<Self::Value, E>
890    where
891        E: de::Error,
892    {
893        if field == self.tag.as_bytes() {
894            Ok(TagContentOtherField::Tag)
895        } else if field == self.content.as_bytes() {
896            Ok(TagContentOtherField::Content)
897        } else {
898            Ok(TagContentOtherField::Other)
899        }
900    }
901}
902
903/// Not public API
904pub struct ContentDeserializer<'de, E> {
905    content: Content<'de>,
906    err: PhantomData<E>,
907}
908
909impl<'de, E> ContentDeserializer<'de, E>
910where
911    E: de::Error,
912{
913    #[cold]
914    fn invalid_type(self, exp: &dyn Expected) -> E {
915        de::Error::invalid_type(self.content.unexpected(), exp)
916    }
917
918    fn deserialize_integer<V>(self, visitor: V) -> Result<V::Value, E>
919    where
920        V: Visitor<'de>,
921    {
922        match self.content {
923            Content::U8(v) => visitor.visit_u8(v),
924            Content::U16(v) => visitor.visit_u16(v),
925            Content::U32(v) => visitor.visit_u32(v),
926            Content::U64(v) => visitor.visit_u64(v),
927            Content::I8(v) => visitor.visit_i8(v),
928            Content::I16(v) => visitor.visit_i16(v),
929            Content::I32(v) => visitor.visit_i32(v),
930            Content::I64(v) => visitor.visit_i64(v),
931            _ => Err(self.invalid_type(&visitor)),
932        }
933    }
934
935    fn deserialize_float<V>(self, visitor: V) -> Result<V::Value, E>
936    where
937        V: Visitor<'de>,
938    {
939        match self.content {
940            Content::F32(v) => visitor.visit_f32(v),
941            Content::F64(v) => visitor.visit_f64(v),
942            Content::U8(v) => visitor.visit_u8(v),
943            Content::U16(v) => visitor.visit_u16(v),
944            Content::U32(v) => visitor.visit_u32(v),
945            Content::U64(v) => visitor.visit_u64(v),
946            Content::I8(v) => visitor.visit_i8(v),
947            Content::I16(v) => visitor.visit_i16(v),
948            Content::I32(v) => visitor.visit_i32(v),
949            Content::I64(v) => visitor.visit_i64(v),
950            _ => Err(self.invalid_type(&visitor)),
951        }
952    }
953}
954
955fn visit_content_seq<'de, V, E>(content: Vec<Content<'de>>, visitor: V) -> Result<V::Value, E>
956where
957    V: Visitor<'de>,
958    E: de::Error,
959{
960    let mut seq_visitor = SeqDeserializer::new(content.into_iter());
961    let value = tri!(visitor.visit_seq(&mut seq_visitor));
962    tri!(seq_visitor.end());
963    Ok(value)
964}
965
966fn visit_content_map<'de, V, E>(
967    content: Vec<(Content<'de>, Content<'de>)>,
968    visitor: V,
969) -> Result<V::Value, E>
970where
971    V: Visitor<'de>,
972    E: de::Error,
973{
974    let mut map_visitor =
975        MapDeserializer::new(content.into_iter().map(|(k, v)| (MapKeyContent(k), v)));
976    let value = tri!(visitor.visit_map(&mut map_visitor));
977    tri!(map_visitor.end());
978    Ok(value)
979}
980
981/// Used when deserializing an internally tagged enum because the content
982/// will be used exactly once.
983impl<'de, E> Deserializer<'de> for ContentDeserializer<'de, E>
984where
985    E: de::Error,
986{
987    type Error = E;
988
989    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
990    where
991        V: Visitor<'de>,
992    {
993        match self.content {
994            Content::Bool(v) => visitor.visit_bool(v),
995            Content::U8(v) => visitor.visit_u8(v),
996            Content::U16(v) => visitor.visit_u16(v),
997            Content::U32(v) => visitor.visit_u32(v),
998            Content::U64(v) => visitor.visit_u64(v),
999            Content::I8(v) => visitor.visit_i8(v),
1000            Content::I16(v) => visitor.visit_i16(v),
1001            Content::I32(v) => visitor.visit_i32(v),
1002            Content::I64(v) => visitor.visit_i64(v),
1003            Content::F32(v) => visitor.visit_f32(v),
1004            Content::F64(v) => visitor.visit_f64(v),
1005            Content::Char(v) => visitor.visit_char(v),
1006            Content::String(v) => visitor.visit_string(v),
1007            Content::Str(v) => visitor.visit_borrowed_str(v),
1008            Content::ByteBuf(v) => visitor.visit_byte_buf(v),
1009            Content::Bytes(v) => visitor.visit_borrowed_bytes(v),
1010            Content::Unit => visitor.visit_unit(),
1011            Content::None => visitor.visit_none(),
1012            Content::Some(v) => visitor.visit_some(ContentDeserializer::new(*v)),
1013            Content::Newtype(v) => visitor.visit_newtype_struct(ContentDeserializer::new(*v)),
1014            Content::Seq(v) => visit_content_seq(v, visitor),
1015            Content::Map(v) => visit_content_map(v, visitor),
1016        }
1017    }
1018
1019    fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1020    where
1021        V: Visitor<'de>,
1022    {
1023        match self.content {
1024            Content::Bool(v) => visitor.visit_bool(v),
1025            _ => Err(self.invalid_type(&visitor)),
1026        }
1027    }
1028
1029    fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1030    where
1031        V: Visitor<'de>,
1032    {
1033        self.deserialize_integer(visitor)
1034    }
1035
1036    fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1037    where
1038        V: Visitor<'de>,
1039    {
1040        self.deserialize_integer(visitor)
1041    }
1042
1043    fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1044    where
1045        V: Visitor<'de>,
1046    {
1047        self.deserialize_integer(visitor)
1048    }
1049
1050    fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1051    where
1052        V: Visitor<'de>,
1053    {
1054        self.deserialize_integer(visitor)
1055    }
1056
1057    fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1058    where
1059        V: Visitor<'de>,
1060    {
1061        self.deserialize_integer(visitor)
1062    }
1063
1064    fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1065    where
1066        V: Visitor<'de>,
1067    {
1068        self.deserialize_integer(visitor)
1069    }
1070
1071    fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1072    where
1073        V: Visitor<'de>,
1074    {
1075        self.deserialize_integer(visitor)
1076    }
1077
1078    fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1079    where
1080        V: Visitor<'de>,
1081    {
1082        self.deserialize_integer(visitor)
1083    }
1084
1085    fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1086    where
1087        V: Visitor<'de>,
1088    {
1089        self.deserialize_float(visitor)
1090    }
1091
1092    fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1093    where
1094        V: Visitor<'de>,
1095    {
1096        self.deserialize_float(visitor)
1097    }
1098
1099    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1100    where
1101        V: Visitor<'de>,
1102    {
1103        match self.content {
1104            Content::Char(v) => visitor.visit_char(v),
1105            Content::String(v) => visitor.visit_string(v),
1106            Content::Str(v) => visitor.visit_borrowed_str(v),
1107            _ => Err(self.invalid_type(&visitor)),
1108        }
1109    }
1110
1111    fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1112    where
1113        V: Visitor<'de>,
1114    {
1115        self.deserialize_string(visitor)
1116    }
1117
1118    fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1119    where
1120        V: Visitor<'de>,
1121    {
1122        match self.content {
1123            Content::String(v) => visitor.visit_string(v),
1124            Content::Str(v) => visitor.visit_borrowed_str(v),
1125            Content::ByteBuf(v) => visitor.visit_byte_buf(v),
1126            Content::Bytes(v) => visitor.visit_borrowed_bytes(v),
1127            _ => Err(self.invalid_type(&visitor)),
1128        }
1129    }
1130
1131    fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1132    where
1133        V: Visitor<'de>,
1134    {
1135        self.deserialize_byte_buf(visitor)
1136    }
1137
1138    fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1139    where
1140        V: Visitor<'de>,
1141    {
1142        match self.content {
1143            Content::String(v) => visitor.visit_string(v),
1144            Content::Str(v) => visitor.visit_borrowed_str(v),
1145            Content::ByteBuf(v) => visitor.visit_byte_buf(v),
1146            Content::Bytes(v) => visitor.visit_borrowed_bytes(v),
1147            Content::Seq(v) => visit_content_seq(v, visitor),
1148            _ => Err(self.invalid_type(&visitor)),
1149        }
1150    }
1151
1152    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1153    where
1154        V: Visitor<'de>,
1155    {
1156        match self.content {
1157            Content::None => visitor.visit_none(),
1158            Content::Some(v) => visitor.visit_some(ContentDeserializer::new(*v)),
1159            Content::Unit => visitor.visit_unit(),
1160            _ => visitor.visit_some(self),
1161        }
1162    }
1163
1164    fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1165    where
1166        V: Visitor<'de>,
1167    {
1168        match self.content {
1169            Content::Unit => visitor.visit_unit(),
1170
1171            // Allow deserializing newtype variant containing unit.
1172            //
1173            //     #[derive(Deserialize)]
1174            //     #[serde(tag = "result")]
1175            //     enum Response<T> {
1176            //         Success(T),
1177            //     }
1178            //
1179            // We want {"result":"Success"} to deserialize into Response<()>.
1180            Content::Map(ref v) if v.is_empty() => visitor.visit_unit(),
1181            _ => Err(self.invalid_type(&visitor)),
1182        }
1183    }
1184
1185    fn deserialize_unit_struct<V>(
1186        self,
1187        _name: &'static str,
1188        visitor: V,
1189    ) -> Result<V::Value, Self::Error>
1190    where
1191        V: Visitor<'de>,
1192    {
1193        match self.content {
1194            // As a special case, allow deserializing untagged newtype
1195            // variant containing unit struct.
1196            //
1197            //     #[derive(Deserialize)]
1198            //     struct Info;
1199            //
1200            //     #[derive(Deserialize)]
1201            //     #[serde(tag = "topic")]
1202            //     enum Message {
1203            //         Info(Info),
1204            //     }
1205            //
1206            // We want {"topic":"Info"} to deserialize even though
1207            // ordinarily unit structs do not deserialize from empty map/seq.
1208            Content::Map(ref v) if v.is_empty() => visitor.visit_unit(),
1209            Content::Seq(ref v) if v.is_empty() => visitor.visit_unit(),
1210            _ => self.deserialize_any(visitor),
1211        }
1212    }
1213
1214    fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, Self::Error>
1215    where
1216        V: Visitor<'de>,
1217    {
1218        match self.content {
1219            Content::Newtype(v) => visitor.visit_newtype_struct(ContentDeserializer::new(*v)),
1220            _ => visitor.visit_newtype_struct(self),
1221        }
1222    }
1223
1224    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1225    where
1226        V: Visitor<'de>,
1227    {
1228        match self.content {
1229            Content::Seq(v) => visit_content_seq(v, visitor),
1230            _ => Err(self.invalid_type(&visitor)),
1231        }
1232    }
1233
1234    fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
1235    where
1236        V: Visitor<'de>,
1237    {
1238        self.deserialize_seq(visitor)
1239    }
1240
1241    fn deserialize_tuple_struct<V>(
1242        self,
1243        _name: &'static str,
1244        _len: usize,
1245        visitor: V,
1246    ) -> Result<V::Value, Self::Error>
1247    where
1248        V: Visitor<'de>,
1249    {
1250        self.deserialize_seq(visitor)
1251    }
1252
1253    fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1254    where
1255        V: Visitor<'de>,
1256    {
1257        match self.content {
1258            Content::Map(v) => visit_content_map(v, visitor),
1259            _ => Err(self.invalid_type(&visitor)),
1260        }
1261    }
1262
1263    fn deserialize_struct<V>(
1264        self,
1265        _name: &'static str,
1266        _fields: &'static [&'static str],
1267        visitor: V,
1268    ) -> Result<V::Value, Self::Error>
1269    where
1270        V: Visitor<'de>,
1271    {
1272        match self.content {
1273            Content::Seq(v) => visit_content_seq(v, visitor),
1274            Content::Map(v) => visit_content_map(v, visitor),
1275            _ => Err(self.invalid_type(&visitor)),
1276        }
1277    }
1278
1279    fn deserialize_enum<V>(
1280        self,
1281        _name: &str,
1282        _variants: &'static [&'static str],
1283        visitor: V,
1284    ) -> Result<V::Value, Self::Error>
1285    where
1286        V: Visitor<'de>,
1287    {
1288        let (variant, value) = match self.content {
1289            Content::Map(value) => {
1290                let mut iter = value.into_iter();
1291                let (variant, value) = match iter.next() {
1292                    Some(v) => v,
1293                    None => {
1294                        return Err(de::Error::invalid_value(
1295                            de::Unexpected::Map,
1296                            &"map with a single key",
1297                        ));
1298                    }
1299                };
1300                // enums are encoded in json as maps with a single key:value pair
1301                if iter.next().is_some() {
1302                    return Err(de::Error::invalid_value(
1303                        de::Unexpected::Map,
1304                        &"map with a single key",
1305                    ));
1306                }
1307                (variant, Some(value))
1308            }
1309            s @ Content::String(_) | s @ Content::Str(_) => (s, None),
1310            other => {
1311                return Err(de::Error::invalid_type(
1312                    other.unexpected(),
1313                    &"string or map",
1314                ));
1315            }
1316        };
1317
1318        visitor.visit_enum(EnumDeserializer::new(variant, value))
1319    }
1320
1321    fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1322    where
1323        V: Visitor<'de>,
1324    {
1325        match self.content {
1326            Content::String(v) => visitor.visit_string(v),
1327            Content::Str(v) => visitor.visit_borrowed_str(v),
1328            Content::ByteBuf(v) => visitor.visit_byte_buf(v),
1329            Content::Bytes(v) => visitor.visit_borrowed_bytes(v),
1330            Content::U8(v) => visitor.visit_u8(v),
1331            Content::U64(v) => visitor.visit_u64(v),
1332            _ => Err(self.invalid_type(&visitor)),
1333        }
1334    }
1335
1336    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1337    where
1338        V: Visitor<'de>,
1339    {
1340        drop(self);
1341        visitor.visit_unit()
1342    }
1343}
1344
1345impl<'de, E> ContentDeserializer<'de, E> {
1346    /// private API, don't use
1347    pub fn new(content: Content<'de>) -> Self {
1348        ContentDeserializer {
1349            content,
1350            err: PhantomData,
1351        }
1352    }
1353}
1354
1355struct MapKeyContent<'de>(Content<'de>);
1356
1357impl<'de, E> de::IntoDeserializer<'de, E> for MapKeyContent<'de>
1358where
1359    E: de::Error,
1360{
1361    type Deserializer = ContentMapKeyDeserializer<'de, E>;
1362
1363    fn into_deserializer(self) -> Self::Deserializer {
1364        ContentMapKeyDeserializer {
1365            content: self.0,
1366            err: PhantomData,
1367        }
1368    }
1369}
1370
1371struct ContentMapKeyDeserializer<'de, E> {
1372    content: Content<'de>,
1373    err: PhantomData<E>,
1374}
1375
1376impl<'de, E> Deserializer<'de> for ContentMapKeyDeserializer<'de, E>
1377where
1378    E: de::Error,
1379{
1380    type Error = E;
1381
1382    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1383    where
1384        V: Visitor<'de>,
1385    {
1386        ContentDeserializer::new(self.content).deserialize_any(visitor)
1387    }
1388
1389    map_key_integer_method!(owned deserialize_i8, visit_i8, i8);
1390    map_key_integer_method!(owned deserialize_i16, visit_i16, i16);
1391    map_key_integer_method!(owned deserialize_i32, visit_i32, i32);
1392    map_key_integer_method!(owned deserialize_i64, visit_i64, i64);
1393    map_key_integer_method!(owned deserialize_u8, visit_u8, u8);
1394    map_key_integer_method!(owned deserialize_u16, visit_u16, u16);
1395    map_key_integer_method!(owned deserialize_u32, visit_u32, u32);
1396    map_key_integer_method!(owned deserialize_u64, visit_u64, u64);
1397
1398    fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, Self::Error>
1399    where
1400        V: Visitor<'de>,
1401    {
1402        match self.content {
1403            Content::Newtype(v) => visitor.visit_newtype_struct(ContentMapKeyDeserializer {
1404                content: *v,
1405                err: PhantomData,
1406            }),
1407            _ => visitor.visit_newtype_struct(self),
1408        }
1409    }
1410
1411    serde::forward_to_deserialize_any! {
1412        bool f32 f64 char str string bytes byte_buf option unit unit_struct
1413        seq tuple tuple_struct map struct enum identifier
1414        ignored_any
1415    }
1416}
1417
1418pub struct EnumDeserializer<'de, E>
1419where
1420    E: de::Error,
1421{
1422    variant: Content<'de>,
1423    value: Option<Content<'de>>,
1424    err: PhantomData<E>,
1425}
1426
1427impl<'de, E> EnumDeserializer<'de, E>
1428where
1429    E: de::Error,
1430{
1431    pub fn new(variant: Content<'de>, value: Option<Content<'de>>) -> EnumDeserializer<'de, E> {
1432        EnumDeserializer {
1433            variant,
1434            value,
1435            err: PhantomData,
1436        }
1437    }
1438}
1439
1440impl<'de, E> de::EnumAccess<'de> for EnumDeserializer<'de, E>
1441where
1442    E: de::Error,
1443{
1444    type Error = E;
1445    type Variant = VariantDeserializer<'de, Self::Error>;
1446
1447    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), E>
1448    where
1449        V: de::DeserializeSeed<'de>,
1450    {
1451        let visitor = VariantDeserializer {
1452            value: self.value,
1453            err: PhantomData,
1454        };
1455        seed.deserialize(ContentDeserializer::new(self.variant))
1456            .map(|v| (v, visitor))
1457    }
1458}
1459
1460pub struct VariantDeserializer<'de, E>
1461where
1462    E: de::Error,
1463{
1464    value: Option<Content<'de>>,
1465    err: PhantomData<E>,
1466}
1467
1468impl<'de, E> de::VariantAccess<'de> for VariantDeserializer<'de, E>
1469where
1470    E: de::Error,
1471{
1472    type Error = E;
1473
1474    fn unit_variant(self) -> Result<(), E> {
1475        match self.value {
1476            Some(value) => de::Deserialize::deserialize(ContentDeserializer::new(value)),
1477            None => Ok(()),
1478        }
1479    }
1480
1481    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, E>
1482    where
1483        T: de::DeserializeSeed<'de>,
1484    {
1485        match self.value {
1486            Some(value) => seed.deserialize(ContentDeserializer::new(value)),
1487            None => Err(de::Error::invalid_type(
1488                de::Unexpected::UnitVariant,
1489                &"newtype variant",
1490            )),
1491        }
1492    }
1493
1494    fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
1495    where
1496        V: de::Visitor<'de>,
1497    {
1498        match self.value {
1499            Some(Content::Seq(v)) => {
1500                de::Deserializer::deserialize_any(SeqDeserializer::new(v.into_iter()), visitor)
1501            }
1502            Some(other) => Err(de::Error::invalid_type(
1503                other.unexpected(),
1504                &"tuple variant",
1505            )),
1506            None => Err(de::Error::invalid_type(
1507                de::Unexpected::UnitVariant,
1508                &"tuple variant",
1509            )),
1510        }
1511    }
1512
1513    fn struct_variant<V>(
1514        self,
1515        _fields: &'static [&'static str],
1516        visitor: V,
1517    ) -> Result<V::Value, Self::Error>
1518    where
1519        V: de::Visitor<'de>,
1520    {
1521        match self.value {
1522            Some(Content::Map(v)) => {
1523                de::Deserializer::deserialize_any(MapDeserializer::new(v.into_iter()), visitor)
1524            }
1525            Some(Content::Seq(v)) => {
1526                de::Deserializer::deserialize_any(SeqDeserializer::new(v.into_iter()), visitor)
1527            }
1528            Some(other) => Err(de::Error::invalid_type(
1529                other.unexpected(),
1530                &"struct variant",
1531            )),
1532            None => Err(de::Error::invalid_type(
1533                de::Unexpected::UnitVariant,
1534                &"struct variant",
1535            )),
1536        }
1537    }
1538}
1539
1540/// Not public API.
1541pub struct ContentRefDeserializer<'a, 'de: 'a, E> {
1542    content: &'a Content<'de>,
1543    err: PhantomData<E>,
1544}
1545
1546impl<'a, 'de, E> ContentRefDeserializer<'a, 'de, E>
1547where
1548    E: de::Error,
1549{
1550    #[cold]
1551    fn invalid_type(self, exp: &dyn Expected) -> E {
1552        de::Error::invalid_type(self.content.unexpected(), exp)
1553    }
1554
1555    fn deserialize_integer<V>(self, visitor: V) -> Result<V::Value, E>
1556    where
1557        V: Visitor<'de>,
1558    {
1559        match *self.content {
1560            Content::U8(v) => visitor.visit_u8(v),
1561            Content::U16(v) => visitor.visit_u16(v),
1562            Content::U32(v) => visitor.visit_u32(v),
1563            Content::U64(v) => visitor.visit_u64(v),
1564            Content::I8(v) => visitor.visit_i8(v),
1565            Content::I16(v) => visitor.visit_i16(v),
1566            Content::I32(v) => visitor.visit_i32(v),
1567            Content::I64(v) => visitor.visit_i64(v),
1568            _ => Err(self.invalid_type(&visitor)),
1569        }
1570    }
1571
1572    fn deserialize_float<V>(self, visitor: V) -> Result<V::Value, E>
1573    where
1574        V: Visitor<'de>,
1575    {
1576        match *self.content {
1577            Content::F32(v) => visitor.visit_f32(v),
1578            Content::F64(v) => visitor.visit_f64(v),
1579            Content::U8(v) => visitor.visit_u8(v),
1580            Content::U16(v) => visitor.visit_u16(v),
1581            Content::U32(v) => visitor.visit_u32(v),
1582            Content::U64(v) => visitor.visit_u64(v),
1583            Content::I8(v) => visitor.visit_i8(v),
1584            Content::I16(v) => visitor.visit_i16(v),
1585            Content::I32(v) => visitor.visit_i32(v),
1586            Content::I64(v) => visitor.visit_i64(v),
1587            _ => Err(self.invalid_type(&visitor)),
1588        }
1589    }
1590}
1591
1592fn visit_content_seq_ref<'a, 'de, V, E>(
1593    content: &'a [Content<'de>],
1594    visitor: V,
1595) -> Result<V::Value, E>
1596where
1597    V: Visitor<'de>,
1598    E: de::Error,
1599{
1600    let mut seq_visitor = SeqDeserializer::new(content.iter());
1601    let value = tri!(visitor.visit_seq(&mut seq_visitor));
1602    tri!(seq_visitor.end());
1603    Ok(value)
1604}
1605
1606fn visit_content_map_ref<'a, 'de, V, E>(
1607    content: &'a [(Content<'de>, Content<'de>)],
1608    visitor: V,
1609) -> Result<V::Value, E>
1610where
1611    V: Visitor<'de>,
1612    E: de::Error,
1613{
1614    let map = content.iter().map(|(k, v)| (MapKeyContentRef(k), &*v));
1615    let mut map_visitor = MapDeserializer::new(map);
1616    let value = tri!(visitor.visit_map(&mut map_visitor));
1617    tri!(map_visitor.end());
1618    Ok(value)
1619}
1620
1621/// Used when deserializing an untagged enum because the content may need
1622/// to be used more than once.
1623impl<'de, 'a, E> Deserializer<'de> for ContentRefDeserializer<'a, 'de, E>
1624where
1625    E: de::Error,
1626{
1627    type Error = E;
1628
1629    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, E>
1630    where
1631        V: Visitor<'de>,
1632    {
1633        match *self.content {
1634            Content::Bool(v) => visitor.visit_bool(v),
1635            Content::U8(v) => visitor.visit_u8(v),
1636            Content::U16(v) => visitor.visit_u16(v),
1637            Content::U32(v) => visitor.visit_u32(v),
1638            Content::U64(v) => visitor.visit_u64(v),
1639            Content::I8(v) => visitor.visit_i8(v),
1640            Content::I16(v) => visitor.visit_i16(v),
1641            Content::I32(v) => visitor.visit_i32(v),
1642            Content::I64(v) => visitor.visit_i64(v),
1643            Content::F32(v) => visitor.visit_f32(v),
1644            Content::F64(v) => visitor.visit_f64(v),
1645            Content::Char(v) => visitor.visit_char(v),
1646            Content::String(ref v) => visitor.visit_str(v),
1647            Content::Str(v) => visitor.visit_borrowed_str(v),
1648            Content::ByteBuf(ref v) => visitor.visit_bytes(v),
1649            Content::Bytes(v) => visitor.visit_borrowed_bytes(v),
1650            Content::Unit => visitor.visit_unit(),
1651            Content::None => visitor.visit_none(),
1652            Content::Some(ref v) => visitor.visit_some(ContentRefDeserializer::new(v)),
1653            Content::Newtype(ref v) => visitor.visit_newtype_struct(ContentRefDeserializer::new(v)),
1654            Content::Seq(ref v) => visit_content_seq_ref(v, visitor),
1655            Content::Map(ref v) => visit_content_map_ref(v, visitor),
1656        }
1657    }
1658
1659    fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1660    where
1661        V: Visitor<'de>,
1662    {
1663        match *self.content {
1664            Content::Bool(v) => visitor.visit_bool(v),
1665            _ => Err(self.invalid_type(&visitor)),
1666        }
1667    }
1668
1669    fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1670    where
1671        V: Visitor<'de>,
1672    {
1673        self.deserialize_integer(visitor)
1674    }
1675
1676    fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1677    where
1678        V: Visitor<'de>,
1679    {
1680        self.deserialize_integer(visitor)
1681    }
1682
1683    fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1684    where
1685        V: Visitor<'de>,
1686    {
1687        self.deserialize_integer(visitor)
1688    }
1689
1690    fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1691    where
1692        V: Visitor<'de>,
1693    {
1694        self.deserialize_integer(visitor)
1695    }
1696
1697    fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1698    where
1699        V: Visitor<'de>,
1700    {
1701        self.deserialize_integer(visitor)
1702    }
1703
1704    fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1705    where
1706        V: Visitor<'de>,
1707    {
1708        self.deserialize_integer(visitor)
1709    }
1710
1711    fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1712    where
1713        V: Visitor<'de>,
1714    {
1715        self.deserialize_integer(visitor)
1716    }
1717
1718    fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1719    where
1720        V: Visitor<'de>,
1721    {
1722        self.deserialize_integer(visitor)
1723    }
1724
1725    fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1726    where
1727        V: Visitor<'de>,
1728    {
1729        self.deserialize_float(visitor)
1730    }
1731
1732    fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1733    where
1734        V: Visitor<'de>,
1735    {
1736        self.deserialize_float(visitor)
1737    }
1738
1739    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1740    where
1741        V: Visitor<'de>,
1742    {
1743        match *self.content {
1744            Content::Char(v) => visitor.visit_char(v),
1745            Content::String(ref v) => visitor.visit_str(v),
1746            Content::Str(v) => visitor.visit_borrowed_str(v),
1747            _ => Err(self.invalid_type(&visitor)),
1748        }
1749    }
1750
1751    fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1752    where
1753        V: Visitor<'de>,
1754    {
1755        match *self.content {
1756            Content::String(ref v) => visitor.visit_str(v),
1757            Content::Str(v) => visitor.visit_borrowed_str(v),
1758            Content::ByteBuf(ref v) => visitor.visit_bytes(v),
1759            Content::Bytes(v) => visitor.visit_borrowed_bytes(v),
1760            _ => Err(self.invalid_type(&visitor)),
1761        }
1762    }
1763
1764    fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1765    where
1766        V: Visitor<'de>,
1767    {
1768        self.deserialize_str(visitor)
1769    }
1770
1771    fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1772    where
1773        V: Visitor<'de>,
1774    {
1775        match *self.content {
1776            Content::String(ref v) => visitor.visit_str(v),
1777            Content::Str(v) => visitor.visit_borrowed_str(v),
1778            Content::ByteBuf(ref v) => visitor.visit_bytes(v),
1779            Content::Bytes(v) => visitor.visit_borrowed_bytes(v),
1780            Content::Seq(ref v) => visit_content_seq_ref(v, visitor),
1781            _ => Err(self.invalid_type(&visitor)),
1782        }
1783    }
1784
1785    fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1786    where
1787        V: Visitor<'de>,
1788    {
1789        self.deserialize_bytes(visitor)
1790    }
1791
1792    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, E>
1793    where
1794        V: Visitor<'de>,
1795    {
1796        // Covered by tests/test_enum_untagged.rs
1797        //      with_optional_field::*
1798        match *self.content {
1799            Content::None => visitor.visit_none(),
1800            Content::Some(ref v) => visitor.visit_some(ContentRefDeserializer::new(v)),
1801            Content::Unit => visitor.visit_unit(),
1802            // This case is to support data formats which do not encode an
1803            // indication whether a value is optional. An example of such a
1804            // format is JSON, and a counterexample is RON. When requesting
1805            // `deserialize_any` in JSON, the data format never performs
1806            // `Visitor::visit_some` but we still must be able to
1807            // deserialize the resulting Content into data structures with
1808            // optional fields.
1809            _ => visitor.visit_some(self),
1810        }
1811    }
1812
1813    fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1814    where
1815        V: Visitor<'de>,
1816    {
1817        match *self.content {
1818            Content::Unit => visitor.visit_unit(),
1819            _ => Err(self.invalid_type(&visitor)),
1820        }
1821    }
1822
1823    fn deserialize_unit_struct<V>(
1824        self,
1825        _name: &'static str,
1826        visitor: V,
1827    ) -> Result<V::Value, Self::Error>
1828    where
1829        V: Visitor<'de>,
1830    {
1831        self.deserialize_unit(visitor)
1832    }
1833
1834    fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, E>
1835    where
1836        V: Visitor<'de>,
1837    {
1838        // Covered by tests/test_enum_untagged.rs
1839        //      newtype_struct
1840        match *self.content {
1841            Content::Newtype(ref v) => visitor.visit_newtype_struct(ContentRefDeserializer::new(v)),
1842            // This case is to support data formats that encode newtype
1843            // structs and their underlying data the same, with no
1844            // indication whether a newtype wrapper was present. For example
1845            // JSON does this, while RON does not. In RON a newtype's name
1846            // is included in the serialized representation and it knows to
1847            // call `Visitor::visit_newtype_struct` from `deserialize_any`.
1848            // JSON's `deserialize_any` never calls `visit_newtype_struct`
1849            // but in this code we still must be able to deserialize the
1850            // resulting Content into newtypes.
1851            _ => visitor.visit_newtype_struct(self),
1852        }
1853    }
1854
1855    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1856    where
1857        V: Visitor<'de>,
1858    {
1859        match *self.content {
1860            Content::Seq(ref v) => visit_content_seq_ref(v, visitor),
1861            _ => Err(self.invalid_type(&visitor)),
1862        }
1863    }
1864
1865    fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
1866    where
1867        V: Visitor<'de>,
1868    {
1869        self.deserialize_seq(visitor)
1870    }
1871
1872    fn deserialize_tuple_struct<V>(
1873        self,
1874        _name: &'static str,
1875        _len: usize,
1876        visitor: V,
1877    ) -> Result<V::Value, Self::Error>
1878    where
1879        V: Visitor<'de>,
1880    {
1881        self.deserialize_seq(visitor)
1882    }
1883
1884    fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1885    where
1886        V: Visitor<'de>,
1887    {
1888        match *self.content {
1889            Content::Map(ref v) => visit_content_map_ref(v, visitor),
1890            _ => Err(self.invalid_type(&visitor)),
1891        }
1892    }
1893
1894    fn deserialize_struct<V>(
1895        self,
1896        _name: &'static str,
1897        _fields: &'static [&'static str],
1898        visitor: V,
1899    ) -> Result<V::Value, Self::Error>
1900    where
1901        V: Visitor<'de>,
1902    {
1903        match *self.content {
1904            Content::Seq(ref v) => visit_content_seq_ref(v, visitor),
1905            Content::Map(ref v) => visit_content_map_ref(v, visitor),
1906            _ => Err(self.invalid_type(&visitor)),
1907        }
1908    }
1909
1910    fn deserialize_enum<V>(
1911        self,
1912        _name: &str,
1913        _variants: &'static [&'static str],
1914        visitor: V,
1915    ) -> Result<V::Value, Self::Error>
1916    where
1917        V: Visitor<'de>,
1918    {
1919        let (variant, value) = match *self.content {
1920            Content::Map(ref value) => {
1921                let mut iter = value.iter();
1922                let (variant, value) = match iter.next() {
1923                    Some(v) => v,
1924                    None => {
1925                        return Err(de::Error::invalid_value(
1926                            de::Unexpected::Map,
1927                            &"map with a single key",
1928                        ));
1929                    }
1930                };
1931                // enums are encoded in json as maps with a single key:value pair
1932                if iter.next().is_some() {
1933                    return Err(de::Error::invalid_value(
1934                        de::Unexpected::Map,
1935                        &"map with a single key",
1936                    ));
1937                }
1938                (variant, Some(value))
1939            }
1940            ref s @ Content::String(_) | ref s @ Content::Str(_) => (s, None),
1941            ref other => {
1942                return Err(de::Error::invalid_type(
1943                    other.unexpected(),
1944                    &"string or map",
1945                ));
1946            }
1947        };
1948
1949        visitor.visit_enum(EnumRefDeserializer {
1950            variant,
1951            value,
1952            err: PhantomData,
1953        })
1954    }
1955
1956    fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1957    where
1958        V: Visitor<'de>,
1959    {
1960        match *self.content {
1961            Content::String(ref v) => visitor.visit_str(v),
1962            Content::Str(v) => visitor.visit_borrowed_str(v),
1963            Content::ByteBuf(ref v) => visitor.visit_bytes(v),
1964            Content::Bytes(v) => visitor.visit_borrowed_bytes(v),
1965            Content::U8(v) => visitor.visit_u8(v),
1966            Content::U64(v) => visitor.visit_u64(v),
1967            _ => Err(self.invalid_type(&visitor)),
1968        }
1969    }
1970
1971    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1972    where
1973        V: Visitor<'de>,
1974    {
1975        visitor.visit_unit()
1976    }
1977}
1978
1979impl<'a, 'de, E> ContentRefDeserializer<'a, 'de, E> {
1980    /// private API, don't use
1981    pub fn new(content: &'a Content<'de>) -> Self {
1982        ContentRefDeserializer {
1983            content,
1984            err: PhantomData,
1985        }
1986    }
1987}
1988
1989impl<'a, 'de: 'a, E> Copy for ContentRefDeserializer<'a, 'de, E> {}
1990
1991impl<'a, 'de: 'a, E> Clone for ContentRefDeserializer<'a, 'de, E> {
1992    fn clone(&self) -> Self {
1993        *self
1994    }
1995}
1996
1997struct MapKeyContentRef<'a, 'de: 'a>(&'a Content<'de>);
1998
1999impl<'a, 'de, E> de::IntoDeserializer<'de, E> for MapKeyContentRef<'a, 'de>
2000where
2001    E: de::Error,
2002{
2003    type Deserializer = ContentRefMapKeyDeserializer<'a, 'de, E>;
2004
2005    fn into_deserializer(self) -> Self::Deserializer {
2006        ContentRefMapKeyDeserializer {
2007            content: self.0,
2008            err: PhantomData,
2009        }
2010    }
2011}
2012
2013struct ContentRefMapKeyDeserializer<'a, 'de: 'a, E> {
2014    content: &'a Content<'de>,
2015    err: PhantomData<E>,
2016}
2017
2018impl<'a, 'de: 'a, E> Copy for ContentRefMapKeyDeserializer<'a, 'de, E> {}
2019
2020impl<'a, 'de: 'a, E> Clone for ContentRefMapKeyDeserializer<'a, 'de, E> {
2021    fn clone(&self) -> Self {
2022        *self
2023    }
2024}
2025
2026impl<'de, 'a, E> Deserializer<'de> for ContentRefMapKeyDeserializer<'a, 'de, E>
2027where
2028    E: de::Error,
2029{
2030    type Error = E;
2031
2032    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
2033    where
2034        V: Visitor<'de>,
2035    {
2036        ContentRefDeserializer::new(self.content).deserialize_any(visitor)
2037    }
2038
2039    map_key_integer_method!(ref deserialize_i8, visit_i8, i8);
2040    map_key_integer_method!(ref deserialize_i16, visit_i16, i16);
2041    map_key_integer_method!(ref deserialize_i32, visit_i32, i32);
2042    map_key_integer_method!(ref deserialize_i64, visit_i64, i64);
2043    map_key_integer_method!(ref deserialize_u8, visit_u8, u8);
2044    map_key_integer_method!(ref deserialize_u16, visit_u16, u16);
2045    map_key_integer_method!(ref deserialize_u32, visit_u32, u32);
2046    map_key_integer_method!(ref deserialize_u64, visit_u64, u64);
2047
2048    fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, Self::Error>
2049    where
2050        V: Visitor<'de>,
2051    {
2052        match *self.content {
2053            Content::Newtype(ref v) => visitor.visit_newtype_struct(ContentRefMapKeyDeserializer {
2054                content: v,
2055                err: PhantomData,
2056            }),
2057            _ => visitor.visit_newtype_struct(self),
2058        }
2059    }
2060
2061    serde::forward_to_deserialize_any! {
2062        bool f32 f64 char str string bytes byte_buf option unit unit_struct
2063        seq tuple tuple_struct map struct enum identifier
2064        ignored_any
2065    }
2066}
2067
2068struct EnumRefDeserializer<'a, 'de: 'a, E>
2069where
2070    E: de::Error,
2071{
2072    variant: &'a Content<'de>,
2073    value: Option<&'a Content<'de>>,
2074    err: PhantomData<E>,
2075}
2076
2077impl<'de, 'a, E> de::EnumAccess<'de> for EnumRefDeserializer<'a, 'de, E>
2078where
2079    E: de::Error,
2080{
2081    type Error = E;
2082    type Variant = VariantRefDeserializer<'a, 'de, Self::Error>;
2083
2084    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
2085    where
2086        V: de::DeserializeSeed<'de>,
2087    {
2088        let visitor = VariantRefDeserializer {
2089            value: self.value,
2090            err: PhantomData,
2091        };
2092        seed.deserialize(ContentRefDeserializer::new(self.variant))
2093            .map(|v| (v, visitor))
2094    }
2095}
2096
2097struct VariantRefDeserializer<'a, 'de: 'a, E>
2098where
2099    E: de::Error,
2100{
2101    value: Option<&'a Content<'de>>,
2102    err: PhantomData<E>,
2103}
2104
2105impl<'de, 'a, E> de::VariantAccess<'de> for VariantRefDeserializer<'a, 'de, E>
2106where
2107    E: de::Error,
2108{
2109    type Error = E;
2110
2111    fn unit_variant(self) -> Result<(), E> {
2112        match self.value {
2113            Some(value) => de::Deserialize::deserialize(ContentRefDeserializer::new(value)),
2114            // Covered by tests/test_annotations.rs
2115            //      test_partially_untagged_adjacently_tagged_enum
2116            // Covered by tests/test_enum_untagged.rs
2117            //      newtype_enum::unit
2118            None => Ok(()),
2119        }
2120    }
2121
2122    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, E>
2123    where
2124        T: de::DeserializeSeed<'de>,
2125    {
2126        match self.value {
2127            // Covered by tests/test_annotations.rs
2128            //      test_partially_untagged_enum_desugared
2129            //      test_partially_untagged_enum_generic
2130            // Covered by tests/test_enum_untagged.rs
2131            //      newtype_enum::newtype
2132            Some(value) => seed.deserialize(ContentRefDeserializer::new(value)),
2133            None => Err(de::Error::invalid_type(
2134                de::Unexpected::UnitVariant,
2135                &"newtype variant",
2136            )),
2137        }
2138    }
2139
2140    fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
2141    where
2142        V: de::Visitor<'de>,
2143    {
2144        match self.value {
2145            // Covered by tests/test_annotations.rs
2146            //      test_partially_untagged_enum
2147            //      test_partially_untagged_enum_desugared
2148            // Covered by tests/test_enum_untagged.rs
2149            //      newtype_enum::tuple0
2150            //      newtype_enum::tuple2
2151            Some(Content::Seq(v)) => visit_content_seq_ref(v, visitor),
2152            Some(other) => Err(de::Error::invalid_type(
2153                other.unexpected(),
2154                &"tuple variant",
2155            )),
2156            None => Err(de::Error::invalid_type(
2157                de::Unexpected::UnitVariant,
2158                &"tuple variant",
2159            )),
2160        }
2161    }
2162
2163    fn struct_variant<V>(
2164        self,
2165        _fields: &'static [&'static str],
2166        visitor: V,
2167    ) -> Result<V::Value, Self::Error>
2168    where
2169        V: de::Visitor<'de>,
2170    {
2171        match self.value {
2172            // Covered by tests/test_enum_untagged.rs
2173            //      newtype_enum::struct_from_map
2174            Some(Content::Map(v)) => visit_content_map_ref(v, visitor),
2175            // Covered by tests/test_enum_untagged.rs
2176            //      newtype_enum::struct_from_seq
2177            //      newtype_enum::empty_struct_from_seq
2178            Some(Content::Seq(v)) => visit_content_seq_ref(v, visitor),
2179            Some(other) => Err(de::Error::invalid_type(
2180                other.unexpected(),
2181                &"struct variant",
2182            )),
2183            None => Err(de::Error::invalid_type(
2184                de::Unexpected::UnitVariant,
2185                &"struct variant",
2186            )),
2187        }
2188    }
2189}
2190
2191impl<'de, E> de::IntoDeserializer<'de, E> for ContentDeserializer<'de, E>
2192where
2193    E: de::Error,
2194{
2195    type Deserializer = Self;
2196
2197    fn into_deserializer(self) -> Self {
2198        self
2199    }
2200}
2201
2202impl<'de, 'a, E> de::IntoDeserializer<'de, E> for ContentRefDeserializer<'a, 'de, E>
2203where
2204    E: de::Error,
2205{
2206    type Deserializer = Self;
2207
2208    fn into_deserializer(self) -> Self {
2209        self
2210    }
2211}
2212
2213/// Visitor for deserializing an internally tagged unit variant.
2214///
2215/// Not public API.
2216pub struct InternallyTaggedUnitVisitor<'a> {
2217    type_name: &'a str,
2218    variant_name: &'a str,
2219}
2220
2221impl<'a> InternallyTaggedUnitVisitor<'a> {
2222    /// Not public API.
2223    pub fn new(type_name: &'a str, variant_name: &'a str) -> Self {
2224        InternallyTaggedUnitVisitor {
2225            type_name,
2226            variant_name,
2227        }
2228    }
2229}
2230
2231impl<'de, 'a> Visitor<'de> for InternallyTaggedUnitVisitor<'a> {
2232    type Value = ();
2233
2234    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
2235        write!(
2236            formatter,
2237            "unit variant {}::{}",
2238            self.type_name, self.variant_name
2239        )
2240    }
2241
2242    fn visit_seq<S>(self, _: S) -> Result<(), S::Error>
2243    where
2244        S: SeqAccess<'de>,
2245    {
2246        Ok(())
2247    }
2248
2249    fn visit_map<M>(self, mut access: M) -> Result<(), M::Error>
2250    where
2251        M: MapAccess<'de>,
2252    {
2253        while tri!(access.next_entry::<IgnoredAny, IgnoredAny>()).is_some() {}
2254        Ok(())
2255    }
2256}
2257
2258/// Visitor for deserializing an untagged unit variant.
2259///
2260/// Not public API.
2261pub struct UntaggedUnitVisitor<'a> {
2262    type_name: &'a str,
2263    variant_name: &'a str,
2264}
2265
2266impl<'a> UntaggedUnitVisitor<'a> {
2267    /// Not public API.
2268    pub fn new(type_name: &'a str, variant_name: &'a str) -> Self {
2269        UntaggedUnitVisitor {
2270            type_name,
2271            variant_name,
2272        }
2273    }
2274}
2275
2276impl<'de, 'a> Visitor<'de> for UntaggedUnitVisitor<'a> {
2277    type Value = ();
2278
2279    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
2280        write!(
2281            formatter,
2282            "unit variant {}::{}",
2283            self.type_name, self.variant_name
2284        )
2285    }
2286
2287    fn visit_unit<E>(self) -> Result<(), E>
2288    where
2289        E: de::Error,
2290    {
2291        Ok(())
2292    }
2293
2294    fn visit_none<E>(self) -> Result<(), E>
2295    where
2296        E: de::Error,
2297    {
2298        Ok(())
2299    }
2300}