1use 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#[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 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
129struct 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
387pub enum TagOrContent<'de> {
391 Tag,
392 Content(Content<'de>),
393}
394
395struct 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 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
681pub struct TaggedContentVisitor<T> {
688 tag_name: &'static str,
689 expecting: &'static str,
690 value: PhantomData<T>,
691}
692
693impl<T> TaggedContentVisitor<T> {
694 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
756pub enum TagOrContentField {
760 Tag,
761 Content,
762}
763
764pub struct TagOrContentFieldVisitor {
766 pub tag: &'static str,
768 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
831pub enum TagContentOtherField {
836 Tag,
837 Content,
838 Other,
839}
840
841pub struct TagContentOtherFieldVisitor {
843 pub tag: &'static str,
845 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
903pub 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
981impl<'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 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 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 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 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
1540pub 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
1621impl<'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 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 _ => 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 match *self.content {
1841 Content::Newtype(ref v) => visitor.visit_newtype_struct(ContentRefDeserializer::new(v)),
1842 _ => 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 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 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 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 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 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 Some(Content::Map(v)) => visit_content_map_ref(v, visitor),
2175 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
2213pub struct InternallyTaggedUnitVisitor<'a> {
2217 type_name: &'a str,
2218 variant_name: &'a str,
2219}
2220
2221impl<'a> InternallyTaggedUnitVisitor<'a> {
2222 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
2258pub struct UntaggedUnitVisitor<'a> {
2262 type_name: &'a str,
2263 variant_name: &'a str,
2264}
2265
2266impl<'a> UntaggedUnitVisitor<'a> {
2267 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}