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>(
1399        self,
1400        _name: &str,
1401        visitor: V,
1402    ) -> Result<V::Value, Self::Error>
1403    where
1404        V: Visitor<'de>,
1405    {
1406        match self.content {
1407            Content::Newtype(v) => visitor.visit_newtype_struct(ContentMapKeyDeserializer {
1408                content: *v,
1409                err: PhantomData,
1410            }),
1411            _ => visitor.visit_newtype_struct(self),
1412        }
1413    }
1414
1415    serde::forward_to_deserialize_any! {
1416        bool f32 f64 char str string bytes byte_buf option unit unit_struct
1417        seq tuple tuple_struct map struct enum identifier
1418        ignored_any
1419    }
1420}
1421
1422pub struct EnumDeserializer<'de, E>
1423where
1424    E: de::Error,
1425{
1426    variant: Content<'de>,
1427    value: Option<Content<'de>>,
1428    err: PhantomData<E>,
1429}
1430
1431impl<'de, E> EnumDeserializer<'de, E>
1432where
1433    E: de::Error,
1434{
1435    pub fn new(variant: Content<'de>, value: Option<Content<'de>>) -> EnumDeserializer<'de, E> {
1436        EnumDeserializer {
1437            variant,
1438            value,
1439            err: PhantomData,
1440        }
1441    }
1442}
1443
1444impl<'de, E> de::EnumAccess<'de> for EnumDeserializer<'de, E>
1445where
1446    E: de::Error,
1447{
1448    type Error = E;
1449    type Variant = VariantDeserializer<'de, Self::Error>;
1450
1451    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), E>
1452    where
1453        V: de::DeserializeSeed<'de>,
1454    {
1455        let visitor = VariantDeserializer {
1456            value: self.value,
1457            err: PhantomData,
1458        };
1459        seed.deserialize(ContentDeserializer::new(self.variant))
1460            .map(|v| (v, visitor))
1461    }
1462}
1463
1464pub struct VariantDeserializer<'de, E>
1465where
1466    E: de::Error,
1467{
1468    value: Option<Content<'de>>,
1469    err: PhantomData<E>,
1470}
1471
1472impl<'de, E> de::VariantAccess<'de> for VariantDeserializer<'de, E>
1473where
1474    E: de::Error,
1475{
1476    type Error = E;
1477
1478    fn unit_variant(self) -> Result<(), E> {
1479        match self.value {
1480            Some(value) => de::Deserialize::deserialize(ContentDeserializer::new(value)),
1481            None => Ok(()),
1482        }
1483    }
1484
1485    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, E>
1486    where
1487        T: de::DeserializeSeed<'de>,
1488    {
1489        match self.value {
1490            Some(value) => seed.deserialize(ContentDeserializer::new(value)),
1491            None => Err(de::Error::invalid_type(
1492                de::Unexpected::UnitVariant,
1493                &"newtype variant",
1494            )),
1495        }
1496    }
1497
1498    fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
1499    where
1500        V: de::Visitor<'de>,
1501    {
1502        match self.value {
1503            Some(Content::Seq(v)) => {
1504                de::Deserializer::deserialize_any(SeqDeserializer::new(v.into_iter()), visitor)
1505            }
1506            Some(other) => Err(de::Error::invalid_type(
1507                other.unexpected(),
1508                &"tuple variant",
1509            )),
1510            None => Err(de::Error::invalid_type(
1511                de::Unexpected::UnitVariant,
1512                &"tuple variant",
1513            )),
1514        }
1515    }
1516
1517    fn struct_variant<V>(
1518        self,
1519        _fields: &'static [&'static str],
1520        visitor: V,
1521    ) -> Result<V::Value, Self::Error>
1522    where
1523        V: de::Visitor<'de>,
1524    {
1525        match self.value {
1526            Some(Content::Map(v)) => {
1527                de::Deserializer::deserialize_any(MapDeserializer::new(v.into_iter()), visitor)
1528            }
1529            Some(Content::Seq(v)) => {
1530                de::Deserializer::deserialize_any(SeqDeserializer::new(v.into_iter()), visitor)
1531            }
1532            Some(other) => Err(de::Error::invalid_type(
1533                other.unexpected(),
1534                &"struct variant",
1535            )),
1536            None => Err(de::Error::invalid_type(
1537                de::Unexpected::UnitVariant,
1538                &"struct variant",
1539            )),
1540        }
1541    }
1542}
1543
1544/// Not public API.
1545pub struct ContentRefDeserializer<'a, 'de: 'a, E> {
1546    content: &'a Content<'de>,
1547    err: PhantomData<E>,
1548}
1549
1550impl<'a, 'de, E> ContentRefDeserializer<'a, 'de, E>
1551where
1552    E: de::Error,
1553{
1554    #[cold]
1555    fn invalid_type(self, exp: &dyn Expected) -> E {
1556        de::Error::invalid_type(self.content.unexpected(), exp)
1557    }
1558
1559    fn deserialize_integer<V>(self, visitor: V) -> Result<V::Value, E>
1560    where
1561        V: Visitor<'de>,
1562    {
1563        match *self.content {
1564            Content::U8(v) => visitor.visit_u8(v),
1565            Content::U16(v) => visitor.visit_u16(v),
1566            Content::U32(v) => visitor.visit_u32(v),
1567            Content::U64(v) => visitor.visit_u64(v),
1568            Content::I8(v) => visitor.visit_i8(v),
1569            Content::I16(v) => visitor.visit_i16(v),
1570            Content::I32(v) => visitor.visit_i32(v),
1571            Content::I64(v) => visitor.visit_i64(v),
1572            _ => Err(self.invalid_type(&visitor)),
1573        }
1574    }
1575
1576    fn deserialize_float<V>(self, visitor: V) -> Result<V::Value, E>
1577    where
1578        V: Visitor<'de>,
1579    {
1580        match *self.content {
1581            Content::F32(v) => visitor.visit_f32(v),
1582            Content::F64(v) => visitor.visit_f64(v),
1583            Content::U8(v) => visitor.visit_u8(v),
1584            Content::U16(v) => visitor.visit_u16(v),
1585            Content::U32(v) => visitor.visit_u32(v),
1586            Content::U64(v) => visitor.visit_u64(v),
1587            Content::I8(v) => visitor.visit_i8(v),
1588            Content::I16(v) => visitor.visit_i16(v),
1589            Content::I32(v) => visitor.visit_i32(v),
1590            Content::I64(v) => visitor.visit_i64(v),
1591            _ => Err(self.invalid_type(&visitor)),
1592        }
1593    }
1594}
1595
1596fn visit_content_seq_ref<'a, 'de, V, E>(
1597    content: &'a [Content<'de>],
1598    visitor: V,
1599) -> Result<V::Value, E>
1600where
1601    V: Visitor<'de>,
1602    E: de::Error,
1603{
1604    let mut seq_visitor = SeqDeserializer::new(content.iter());
1605    let value = tri!(visitor.visit_seq(&mut seq_visitor));
1606    tri!(seq_visitor.end());
1607    Ok(value)
1608}
1609
1610fn visit_content_map_ref<'a, 'de, V, E>(
1611    content: &'a [(Content<'de>, Content<'de>)],
1612    visitor: V,
1613) -> Result<V::Value, E>
1614where
1615    V: Visitor<'de>,
1616    E: de::Error,
1617{
1618    let map = content
1619        .iter()
1620        .map(|(k, v)| (MapKeyContentRef(k), &*v));
1621    let mut map_visitor = MapDeserializer::new(map);
1622    let value = tri!(visitor.visit_map(&mut map_visitor));
1623    tri!(map_visitor.end());
1624    Ok(value)
1625}
1626
1627/// Used when deserializing an untagged enum because the content may need
1628/// to be used more than once.
1629impl<'de, 'a, E> Deserializer<'de> for ContentRefDeserializer<'a, 'de, E>
1630where
1631    E: de::Error,
1632{
1633    type Error = E;
1634
1635    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, E>
1636    where
1637        V: Visitor<'de>,
1638    {
1639        match *self.content {
1640            Content::Bool(v) => visitor.visit_bool(v),
1641            Content::U8(v) => visitor.visit_u8(v),
1642            Content::U16(v) => visitor.visit_u16(v),
1643            Content::U32(v) => visitor.visit_u32(v),
1644            Content::U64(v) => visitor.visit_u64(v),
1645            Content::I8(v) => visitor.visit_i8(v),
1646            Content::I16(v) => visitor.visit_i16(v),
1647            Content::I32(v) => visitor.visit_i32(v),
1648            Content::I64(v) => visitor.visit_i64(v),
1649            Content::F32(v) => visitor.visit_f32(v),
1650            Content::F64(v) => visitor.visit_f64(v),
1651            Content::Char(v) => visitor.visit_char(v),
1652            Content::String(ref v) => visitor.visit_str(v),
1653            Content::Str(v) => visitor.visit_borrowed_str(v),
1654            Content::ByteBuf(ref v) => visitor.visit_bytes(v),
1655            Content::Bytes(v) => visitor.visit_borrowed_bytes(v),
1656            Content::Unit => visitor.visit_unit(),
1657            Content::None => visitor.visit_none(),
1658            Content::Some(ref v) => visitor.visit_some(ContentRefDeserializer::new(v)),
1659            Content::Newtype(ref v) => visitor.visit_newtype_struct(ContentRefDeserializer::new(v)),
1660            Content::Seq(ref v) => visit_content_seq_ref(v, visitor),
1661            Content::Map(ref v) => visit_content_map_ref(v, visitor),
1662        }
1663    }
1664
1665    fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1666    where
1667        V: Visitor<'de>,
1668    {
1669        match *self.content {
1670            Content::Bool(v) => visitor.visit_bool(v),
1671            _ => Err(self.invalid_type(&visitor)),
1672        }
1673    }
1674
1675    fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1676    where
1677        V: Visitor<'de>,
1678    {
1679        self.deserialize_integer(visitor)
1680    }
1681
1682    fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1683    where
1684        V: Visitor<'de>,
1685    {
1686        self.deserialize_integer(visitor)
1687    }
1688
1689    fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1690    where
1691        V: Visitor<'de>,
1692    {
1693        self.deserialize_integer(visitor)
1694    }
1695
1696    fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1697    where
1698        V: Visitor<'de>,
1699    {
1700        self.deserialize_integer(visitor)
1701    }
1702
1703    fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1704    where
1705        V: Visitor<'de>,
1706    {
1707        self.deserialize_integer(visitor)
1708    }
1709
1710    fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1711    where
1712        V: Visitor<'de>,
1713    {
1714        self.deserialize_integer(visitor)
1715    }
1716
1717    fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1718    where
1719        V: Visitor<'de>,
1720    {
1721        self.deserialize_integer(visitor)
1722    }
1723
1724    fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1725    where
1726        V: Visitor<'de>,
1727    {
1728        self.deserialize_integer(visitor)
1729    }
1730
1731    fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1732    where
1733        V: Visitor<'de>,
1734    {
1735        self.deserialize_float(visitor)
1736    }
1737
1738    fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1739    where
1740        V: Visitor<'de>,
1741    {
1742        self.deserialize_float(visitor)
1743    }
1744
1745    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1746    where
1747        V: Visitor<'de>,
1748    {
1749        match *self.content {
1750            Content::Char(v) => visitor.visit_char(v),
1751            Content::String(ref v) => visitor.visit_str(v),
1752            Content::Str(v) => visitor.visit_borrowed_str(v),
1753            _ => Err(self.invalid_type(&visitor)),
1754        }
1755    }
1756
1757    fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1758    where
1759        V: Visitor<'de>,
1760    {
1761        match *self.content {
1762            Content::String(ref v) => visitor.visit_str(v),
1763            Content::Str(v) => visitor.visit_borrowed_str(v),
1764            Content::ByteBuf(ref v) => visitor.visit_bytes(v),
1765            Content::Bytes(v) => visitor.visit_borrowed_bytes(v),
1766            _ => Err(self.invalid_type(&visitor)),
1767        }
1768    }
1769
1770    fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1771    where
1772        V: Visitor<'de>,
1773    {
1774        self.deserialize_str(visitor)
1775    }
1776
1777    fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1778    where
1779        V: Visitor<'de>,
1780    {
1781        match *self.content {
1782            Content::String(ref v) => visitor.visit_str(v),
1783            Content::Str(v) => visitor.visit_borrowed_str(v),
1784            Content::ByteBuf(ref v) => visitor.visit_bytes(v),
1785            Content::Bytes(v) => visitor.visit_borrowed_bytes(v),
1786            Content::Seq(ref v) => visit_content_seq_ref(v, visitor),
1787            _ => Err(self.invalid_type(&visitor)),
1788        }
1789    }
1790
1791    fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1792    where
1793        V: Visitor<'de>,
1794    {
1795        self.deserialize_bytes(visitor)
1796    }
1797
1798    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, E>
1799    where
1800        V: Visitor<'de>,
1801    {
1802        // Covered by tests/test_enum_untagged.rs
1803        //      with_optional_field::*
1804        match *self.content {
1805            Content::None => visitor.visit_none(),
1806            Content::Some(ref v) => visitor.visit_some(ContentRefDeserializer::new(v)),
1807            Content::Unit => visitor.visit_unit(),
1808            // This case is to support data formats which do not encode an
1809            // indication whether a value is optional. An example of such a
1810            // format is JSON, and a counterexample is RON. When requesting
1811            // `deserialize_any` in JSON, the data format never performs
1812            // `Visitor::visit_some` but we still must be able to
1813            // deserialize the resulting Content into data structures with
1814            // optional fields.
1815            _ => visitor.visit_some(self),
1816        }
1817    }
1818
1819    fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1820    where
1821        V: Visitor<'de>,
1822    {
1823        match *self.content {
1824            Content::Unit => visitor.visit_unit(),
1825            _ => Err(self.invalid_type(&visitor)),
1826        }
1827    }
1828
1829    fn deserialize_unit_struct<V>(
1830        self,
1831        _name: &'static str,
1832        visitor: V,
1833    ) -> Result<V::Value, Self::Error>
1834    where
1835        V: Visitor<'de>,
1836    {
1837        self.deserialize_unit(visitor)
1838    }
1839
1840    fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, E>
1841    where
1842        V: Visitor<'de>,
1843    {
1844        // Covered by tests/test_enum_untagged.rs
1845        //      newtype_struct
1846        match *self.content {
1847            Content::Newtype(ref v) => visitor.visit_newtype_struct(ContentRefDeserializer::new(v)),
1848            // This case is to support data formats that encode newtype
1849            // structs and their underlying data the same, with no
1850            // indication whether a newtype wrapper was present. For example
1851            // JSON does this, while RON does not. In RON a newtype's name
1852            // is included in the serialized representation and it knows to
1853            // call `Visitor::visit_newtype_struct` from `deserialize_any`.
1854            // JSON's `deserialize_any` never calls `visit_newtype_struct`
1855            // but in this code we still must be able to deserialize the
1856            // resulting Content into newtypes.
1857            _ => visitor.visit_newtype_struct(self),
1858        }
1859    }
1860
1861    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1862    where
1863        V: Visitor<'de>,
1864    {
1865        match *self.content {
1866            Content::Seq(ref v) => visit_content_seq_ref(v, visitor),
1867            _ => Err(self.invalid_type(&visitor)),
1868        }
1869    }
1870
1871    fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
1872    where
1873        V: Visitor<'de>,
1874    {
1875        self.deserialize_seq(visitor)
1876    }
1877
1878    fn deserialize_tuple_struct<V>(
1879        self,
1880        _name: &'static str,
1881        _len: usize,
1882        visitor: V,
1883    ) -> Result<V::Value, Self::Error>
1884    where
1885        V: Visitor<'de>,
1886    {
1887        self.deserialize_seq(visitor)
1888    }
1889
1890    fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1891    where
1892        V: Visitor<'de>,
1893    {
1894        match *self.content {
1895            Content::Map(ref v) => visit_content_map_ref(v, visitor),
1896            _ => Err(self.invalid_type(&visitor)),
1897        }
1898    }
1899
1900    fn deserialize_struct<V>(
1901        self,
1902        _name: &'static str,
1903        _fields: &'static [&'static str],
1904        visitor: V,
1905    ) -> Result<V::Value, Self::Error>
1906    where
1907        V: Visitor<'de>,
1908    {
1909        match *self.content {
1910            Content::Seq(ref v) => visit_content_seq_ref(v, visitor),
1911            Content::Map(ref v) => visit_content_map_ref(v, visitor),
1912            _ => Err(self.invalid_type(&visitor)),
1913        }
1914    }
1915
1916    fn deserialize_enum<V>(
1917        self,
1918        _name: &str,
1919        _variants: &'static [&'static str],
1920        visitor: V,
1921    ) -> Result<V::Value, Self::Error>
1922    where
1923        V: Visitor<'de>,
1924    {
1925        let (variant, value) = match *self.content {
1926            Content::Map(ref value) => {
1927                let mut iter = value.iter();
1928                let (variant, value) = match iter.next() {
1929                    Some(v) => v,
1930                    None => {
1931                        return Err(de::Error::invalid_value(
1932                            de::Unexpected::Map,
1933                            &"map with a single key",
1934                        ));
1935                    }
1936                };
1937                // enums are encoded in json as maps with a single key:value pair
1938                if iter.next().is_some() {
1939                    return Err(de::Error::invalid_value(
1940                        de::Unexpected::Map,
1941                        &"map with a single key",
1942                    ));
1943                }
1944                (variant, Some(value))
1945            }
1946            ref s @ Content::String(_) | ref s @ Content::Str(_) => (s, None),
1947            ref other => {
1948                return Err(de::Error::invalid_type(
1949                    other.unexpected(),
1950                    &"string or map",
1951                ));
1952            }
1953        };
1954
1955        visitor.visit_enum(EnumRefDeserializer {
1956            variant,
1957            value,
1958            err: PhantomData,
1959        })
1960    }
1961
1962    fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1963    where
1964        V: Visitor<'de>,
1965    {
1966        match *self.content {
1967            Content::String(ref v) => visitor.visit_str(v),
1968            Content::Str(v) => visitor.visit_borrowed_str(v),
1969            Content::ByteBuf(ref v) => visitor.visit_bytes(v),
1970            Content::Bytes(v) => visitor.visit_borrowed_bytes(v),
1971            Content::U8(v) => visitor.visit_u8(v),
1972            Content::U64(v) => visitor.visit_u64(v),
1973            _ => Err(self.invalid_type(&visitor)),
1974        }
1975    }
1976
1977    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1978    where
1979        V: Visitor<'de>,
1980    {
1981        visitor.visit_unit()
1982    }
1983}
1984
1985impl<'a, 'de, E> ContentRefDeserializer<'a, 'de, E> {
1986    /// private API, don't use
1987    pub fn new(content: &'a Content<'de>) -> Self {
1988        ContentRefDeserializer {
1989            content,
1990            err: PhantomData,
1991        }
1992    }
1993}
1994
1995impl<'a, 'de: 'a, E> Copy for ContentRefDeserializer<'a, 'de, E> {}
1996
1997impl<'a, 'de: 'a, E> Clone for ContentRefDeserializer<'a, 'de, E> {
1998    fn clone(&self) -> Self {
1999        *self
2000    }
2001}
2002
2003struct MapKeyContentRef<'a, 'de: 'a>(&'a Content<'de>);
2004
2005impl<'a, 'de, E> de::IntoDeserializer<'de, E> for MapKeyContentRef<'a, 'de>
2006where
2007    E: de::Error,
2008{
2009    type Deserializer = ContentRefMapKeyDeserializer<'a, 'de, E>;
2010
2011    fn into_deserializer(self) -> Self::Deserializer {
2012        ContentRefMapKeyDeserializer {
2013            content: self.0,
2014            err: PhantomData,
2015        }
2016    }
2017}
2018
2019struct ContentRefMapKeyDeserializer<'a, 'de: 'a, E> {
2020    content: &'a Content<'de>,
2021    err: PhantomData<E>,
2022}
2023
2024impl<'a, 'de: 'a, E> Copy for ContentRefMapKeyDeserializer<'a, 'de, E> {}
2025
2026impl<'a, 'de: 'a, E> Clone for ContentRefMapKeyDeserializer<'a, 'de, E> {
2027    fn clone(&self) -> Self {
2028        *self
2029    }
2030}
2031
2032impl<'de, 'a, E> Deserializer<'de> for ContentRefMapKeyDeserializer<'a, 'de, E>
2033where
2034    E: de::Error,
2035{
2036    type Error = E;
2037
2038    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
2039    where
2040        V: Visitor<'de>,
2041    {
2042        ContentRefDeserializer::new(self.content).deserialize_any(visitor)
2043    }
2044
2045    map_key_integer_method!(ref deserialize_i8, visit_i8, i8);
2046    map_key_integer_method!(ref deserialize_i16, visit_i16, i16);
2047    map_key_integer_method!(ref deserialize_i32, visit_i32, i32);
2048    map_key_integer_method!(ref deserialize_i64, visit_i64, i64);
2049    map_key_integer_method!(ref deserialize_u8, visit_u8, u8);
2050    map_key_integer_method!(ref deserialize_u16, visit_u16, u16);
2051    map_key_integer_method!(ref deserialize_u32, visit_u32, u32);
2052    map_key_integer_method!(ref deserialize_u64, visit_u64, u64);
2053
2054    fn deserialize_newtype_struct<V>(
2055        self,
2056        _name: &str,
2057        visitor: V,
2058    ) -> Result<V::Value, Self::Error>
2059    where
2060        V: Visitor<'de>,
2061    {
2062        match *self.content {
2063            Content::Newtype(ref v) => visitor.visit_newtype_struct(ContentRefMapKeyDeserializer {
2064                content: v,
2065                err: PhantomData,
2066            }),
2067            _ => visitor.visit_newtype_struct(self),
2068        }
2069    }
2070
2071    serde::forward_to_deserialize_any! {
2072        bool f32 f64 char str string bytes byte_buf option unit unit_struct
2073        seq tuple tuple_struct map struct enum identifier
2074        ignored_any
2075    }
2076}
2077
2078struct EnumRefDeserializer<'a, 'de: 'a, E>
2079where
2080    E: de::Error,
2081{
2082    variant: &'a Content<'de>,
2083    value: Option<&'a Content<'de>>,
2084    err: PhantomData<E>,
2085}
2086
2087impl<'de, 'a, E> de::EnumAccess<'de> for EnumRefDeserializer<'a, 'de, E>
2088where
2089    E: de::Error,
2090{
2091    type Error = E;
2092    type Variant = VariantRefDeserializer<'a, 'de, Self::Error>;
2093
2094    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
2095    where
2096        V: de::DeserializeSeed<'de>,
2097    {
2098        let visitor = VariantRefDeserializer {
2099            value: self.value,
2100            err: PhantomData,
2101        };
2102        seed.deserialize(ContentRefDeserializer::new(self.variant))
2103            .map(|v| (v, visitor))
2104    }
2105}
2106
2107struct VariantRefDeserializer<'a, 'de: 'a, E>
2108where
2109    E: de::Error,
2110{
2111    value: Option<&'a Content<'de>>,
2112    err: PhantomData<E>,
2113}
2114
2115impl<'de, 'a, E> de::VariantAccess<'de> for VariantRefDeserializer<'a, 'de, E>
2116where
2117    E: de::Error,
2118{
2119    type Error = E;
2120
2121    fn unit_variant(self) -> Result<(), E> {
2122        match self.value {
2123            Some(value) => de::Deserialize::deserialize(ContentRefDeserializer::new(value)),
2124            // Covered by tests/test_annotations.rs
2125            //      test_partially_untagged_adjacently_tagged_enum
2126            // Covered by tests/test_enum_untagged.rs
2127            //      newtype_enum::unit
2128            None => Ok(()),
2129        }
2130    }
2131
2132    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, E>
2133    where
2134        T: de::DeserializeSeed<'de>,
2135    {
2136        match self.value {
2137            // Covered by tests/test_annotations.rs
2138            //      test_partially_untagged_enum_desugared
2139            //      test_partially_untagged_enum_generic
2140            // Covered by tests/test_enum_untagged.rs
2141            //      newtype_enum::newtype
2142            Some(value) => seed.deserialize(ContentRefDeserializer::new(value)),
2143            None => Err(de::Error::invalid_type(
2144                de::Unexpected::UnitVariant,
2145                &"newtype variant",
2146            )),
2147        }
2148    }
2149
2150    fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
2151    where
2152        V: de::Visitor<'de>,
2153    {
2154        match self.value {
2155            // Covered by tests/test_annotations.rs
2156            //      test_partially_untagged_enum
2157            //      test_partially_untagged_enum_desugared
2158            // Covered by tests/test_enum_untagged.rs
2159            //      newtype_enum::tuple0
2160            //      newtype_enum::tuple2
2161            Some(Content::Seq(v)) => visit_content_seq_ref(v, visitor),
2162            Some(other) => Err(de::Error::invalid_type(
2163                other.unexpected(),
2164                &"tuple variant",
2165            )),
2166            None => Err(de::Error::invalid_type(
2167                de::Unexpected::UnitVariant,
2168                &"tuple variant",
2169            )),
2170        }
2171    }
2172
2173    fn struct_variant<V>(
2174        self,
2175        _fields: &'static [&'static str],
2176        visitor: V,
2177    ) -> Result<V::Value, Self::Error>
2178    where
2179        V: de::Visitor<'de>,
2180    {
2181        match self.value {
2182            // Covered by tests/test_enum_untagged.rs
2183            //      newtype_enum::struct_from_map
2184            Some(Content::Map(v)) => visit_content_map_ref(v, visitor),
2185            // Covered by tests/test_enum_untagged.rs
2186            //      newtype_enum::struct_from_seq
2187            //      newtype_enum::empty_struct_from_seq
2188            Some(Content::Seq(v)) => visit_content_seq_ref(v, visitor),
2189            Some(other) => Err(de::Error::invalid_type(
2190                other.unexpected(),
2191                &"struct variant",
2192            )),
2193            None => Err(de::Error::invalid_type(
2194                de::Unexpected::UnitVariant,
2195                &"struct variant",
2196            )),
2197        }
2198    }
2199}
2200
2201impl<'de, E> de::IntoDeserializer<'de, E> for ContentDeserializer<'de, E>
2202where
2203    E: de::Error,
2204{
2205    type Deserializer = Self;
2206
2207    fn into_deserializer(self) -> Self {
2208        self
2209    }
2210}
2211
2212impl<'de, 'a, E> de::IntoDeserializer<'de, E> for ContentRefDeserializer<'a, 'de, E>
2213where
2214    E: de::Error,
2215{
2216    type Deserializer = Self;
2217
2218    fn into_deserializer(self) -> Self {
2219        self
2220    }
2221}
2222
2223/// Visitor for deserializing an internally tagged unit variant.
2224///
2225/// Not public API.
2226pub struct InternallyTaggedUnitVisitor<'a> {
2227    type_name: &'a str,
2228    variant_name: &'a str,
2229}
2230
2231impl<'a> InternallyTaggedUnitVisitor<'a> {
2232    /// Not public API.
2233    pub fn new(type_name: &'a str, variant_name: &'a str) -> Self {
2234        InternallyTaggedUnitVisitor {
2235            type_name,
2236            variant_name,
2237        }
2238    }
2239}
2240
2241impl<'de, 'a> Visitor<'de> for InternallyTaggedUnitVisitor<'a> {
2242    type Value = ();
2243
2244    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
2245        write!(
2246            formatter,
2247            "unit variant {}::{}",
2248            self.type_name, self.variant_name
2249        )
2250    }
2251
2252    fn visit_seq<S>(self, _: S) -> Result<(), S::Error>
2253    where
2254        S: SeqAccess<'de>,
2255    {
2256        Ok(())
2257    }
2258
2259    fn visit_map<M>(self, mut access: M) -> Result<(), M::Error>
2260    where
2261        M: MapAccess<'de>,
2262    {
2263        while tri!(access.next_entry::<IgnoredAny, IgnoredAny>()).is_some() {}
2264        Ok(())
2265    }
2266}
2267
2268/// Visitor for deserializing an untagged unit variant.
2269///
2270/// Not public API.
2271pub struct UntaggedUnitVisitor<'a> {
2272    type_name: &'a str,
2273    variant_name: &'a str,
2274}
2275
2276impl<'a> UntaggedUnitVisitor<'a> {
2277    /// Not public API.
2278    pub fn new(type_name: &'a str, variant_name: &'a str) -> Self {
2279        UntaggedUnitVisitor {
2280            type_name,
2281            variant_name,
2282        }
2283    }
2284}
2285
2286impl<'de, 'a> Visitor<'de> for UntaggedUnitVisitor<'a> {
2287    type Value = ();
2288
2289    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
2290        write!(
2291            formatter,
2292            "unit variant {}::{}",
2293            self.type_name, self.variant_name
2294        )
2295    }
2296
2297    fn visit_unit<E>(self) -> Result<(), E>
2298    where
2299        E: de::Error,
2300    {
2301        Ok(())
2302    }
2303
2304    fn visit_none<E>(self) -> Result<(), E>
2305    where
2306        E: de::Error,
2307    {
2308        Ok(())
2309    }
2310}