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>(
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
1544pub 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
1627impl<'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 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 _ => 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 match *self.content {
1847 Content::Newtype(ref v) => visitor.visit_newtype_struct(ContentRefDeserializer::new(v)),
1848 _ => 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 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 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 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 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 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 Some(Content::Map(v)) => visit_content_map_ref(v, visitor),
2185 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
2223pub struct InternallyTaggedUnitVisitor<'a> {
2227 type_name: &'a str,
2228 variant_name: &'a str,
2229}
2230
2231impl<'a> InternallyTaggedUnitVisitor<'a> {
2232 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
2268pub struct UntaggedUnitVisitor<'a> {
2272 type_name: &'a str,
2273 variant_name: &'a str,
2274}
2275
2276impl<'a> UntaggedUnitVisitor<'a> {
2277 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}