1pub mod size_hint {
71 use std::cmp;
72
73 pub fn from_bounds<I>(iter: &I) -> Option<usize>
74 where
75 I: Iterator,
76 {
77 helper(iter.size_hint())
78 }
79
80 #[inline]
81 pub fn cautious(hint: Option<usize>) -> usize {
82 cmp::min(hint.unwrap_or(0), 4096)
83 }
84
85 fn helper(bounds: (usize, Option<usize>)) -> Option<usize> {
86 match bounds {
87 (lower, Some(upper)) if lower == upper => Some(upper),
88 _ => None,
89 }
90 }
91}
92
93
94use std::fmt;
95use std::marker::PhantomData;
96
97use serde::de::{
98 self,
99 Deserialize,
100 Deserializer,
101 EnumAccess,
102 MapAccess,
103 SeqAccess,
104 Unexpected,
105 Visitor,
106};
107
108#[derive(Debug)]
109pub enum Content<'de> {
110 Bool(bool),
111
112 U8(u8),
113 U16(u16),
114 U32(u32),
115 U64(u64),
116
117 I8(i8),
118 I16(i16),
119 I32(i32),
120 I64(i64),
121
122 F32(f32),
123 F64(f64),
124
125 Char(char),
126 String(String),
127 Str(&'de str),
128 ByteBuf(Vec<u8>),
129 Bytes(&'de [u8]),
130
131 None,
132 Some(Box<Content<'de>>),
133
134 Unit,
135 Newtype(Box<Content<'de>>),
136 Seq(Vec<Content<'de>>),
137 Map(Vec<(Content<'de>, Content<'de>)>),
138}
139
140impl<'de> Content<'de> {
141 fn unexpected(&self) -> Unexpected {
142 match *self {
143 Content::Bool(b) => Unexpected::Bool(b),
144 Content::U8(n) => Unexpected::Unsigned(u64::from(n)),
145 Content::U16(n) => Unexpected::Unsigned(u64::from(n)),
146 Content::U32(n) => Unexpected::Unsigned(u64::from(n)),
147 Content::U64(n) => Unexpected::Unsigned(n),
148 Content::I8(n) => Unexpected::Signed(i64::from(n)),
149 Content::I16(n) => Unexpected::Signed(i64::from(n)),
150 Content::I32(n) => Unexpected::Signed(i64::from(n)),
151 Content::I64(n) => Unexpected::Signed(n),
152 Content::F32(f) => Unexpected::Float(f64::from(f)),
153 Content::F64(f) => Unexpected::Float(f),
154 Content::Char(c) => Unexpected::Char(c),
155 Content::String(ref s) => Unexpected::Str(s),
156 Content::Str(s) => Unexpected::Str(s),
157 Content::ByteBuf(ref b) => Unexpected::Bytes(b),
158 Content::Bytes(b) => Unexpected::Bytes(b),
159 Content::None | Content::Some(_) => Unexpected::Option,
160 Content::Unit => Unexpected::Unit,
161 Content::Newtype(_) => Unexpected::NewtypeStruct,
162 Content::Seq(_) => Unexpected::Seq,
163 Content::Map(_) => Unexpected::Map,
164 }
165 }
166}
167
168impl<'de> Deserialize<'de> for Content<'de> {
169 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
170 where
171 D: Deserializer<'de>,
172 {
173 let visitor = ContentVisitor::new();
174 deserializer.deserialize_any(visitor)
175 }
176}
177
178pub struct ContentVisitor<'de> {
179 value: PhantomData<Content<'de>>,
180}
181
182impl<'de> ContentVisitor<'de> {
183 pub fn new() -> Self {
184 ContentVisitor { value: PhantomData }
185 }
186}
187
188impl<'de> Visitor<'de> for ContentVisitor<'de> {
189 type Value = Content<'de>;
190
191 fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
192 fmt.write_str("any value")
193 }
194
195 fn visit_bool<F>(self, value: bool) -> Result<Self::Value, F>
196 where
197 F: de::Error,
198 {
199 Ok(Content::Bool(value))
200 }
201
202 fn visit_i8<F>(self, value: i8) -> Result<Self::Value, F>
203 where
204 F: de::Error,
205 {
206 Ok(Content::I8(value))
207 }
208
209 fn visit_i16<F>(self, value: i16) -> Result<Self::Value, F>
210 where
211 F: de::Error,
212 {
213 Ok(Content::I16(value))
214 }
215
216 fn visit_i32<F>(self, value: i32) -> Result<Self::Value, F>
217 where
218 F: de::Error,
219 {
220 Ok(Content::I32(value))
221 }
222
223 fn visit_i64<F>(self, value: i64) -> Result<Self::Value, F>
224 where
225 F: de::Error,
226 {
227 Ok(Content::I64(value))
228 }
229
230 fn visit_u8<F>(self, value: u8) -> Result<Self::Value, F>
231 where
232 F: de::Error,
233 {
234 Ok(Content::U8(value))
235 }
236
237 fn visit_u16<F>(self, value: u16) -> Result<Self::Value, F>
238 where
239 F: de::Error,
240 {
241 Ok(Content::U16(value))
242 }
243
244 fn visit_u32<F>(self, value: u32) -> Result<Self::Value, F>
245 where
246 F: de::Error,
247 {
248 Ok(Content::U32(value))
249 }
250
251 fn visit_u64<F>(self, value: u64) -> Result<Self::Value, F>
252 where
253 F: de::Error,
254 {
255 Ok(Content::U64(value))
256 }
257
258 fn visit_f32<F>(self, value: f32) -> Result<Self::Value, F>
259 where
260 F: de::Error,
261 {
262 Ok(Content::F32(value))
263 }
264
265 fn visit_f64<F>(self, value: f64) -> Result<Self::Value, F>
266 where
267 F: de::Error,
268 {
269 Ok(Content::F64(value))
270 }
271
272 fn visit_char<F>(self, value: char) -> Result<Self::Value, F>
273 where
274 F: de::Error,
275 {
276 Ok(Content::Char(value))
277 }
278
279 fn visit_str<F>(self, value: &str) -> Result<Self::Value, F>
280 where
281 F: de::Error,
282 {
283 Ok(Content::String(value.into()))
284 }
285
286 fn visit_borrowed_str<F>(self, value: &'de str) -> Result<Self::Value, F>
287 where
288 F: de::Error,
289 {
290 Ok(Content::Str(value))
291 }
292
293 fn visit_string<F>(self, value: String) -> Result<Self::Value, F>
294 where
295 F: de::Error,
296 {
297 Ok(Content::String(value))
298 }
299
300 fn visit_bytes<F>(self, value: &[u8]) -> Result<Self::Value, F>
301 where
302 F: de::Error,
303 {
304 Ok(Content::ByteBuf(value.into()))
305 }
306
307 fn visit_borrowed_bytes<F>(self, value: &'de [u8]) -> Result<Self::Value, F>
308 where
309 F: de::Error,
310 {
311 Ok(Content::Bytes(value))
312 }
313
314 fn visit_byte_buf<F>(self, value: Vec<u8>) -> Result<Self::Value, F>
315 where
316 F: de::Error,
317 {
318 Ok(Content::ByteBuf(value))
319 }
320
321 fn visit_unit<F>(self) -> Result<Self::Value, F>
322 where
323 F: de::Error,
324 {
325 Ok(Content::Unit)
326 }
327
328 fn visit_none<F>(self) -> Result<Self::Value, F>
329 where
330 F: de::Error,
331 {
332 Ok(Content::None)
333 }
334
335 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
336 where
337 D: Deserializer<'de>,
338 {
339 Deserialize::deserialize(deserializer).map(|v| Content::Some(Box::new(v)))
340 }
341
342 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
343 where
344 D: Deserializer<'de>,
345 {
346 Deserialize::deserialize(deserializer).map(|v| Content::Newtype(Box::new(v)))
347 }
348
349 fn visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
350 where
351 V: SeqAccess<'de>,
352 {
353 let mut vec = Vec::with_capacity(size_hint::cautious(visitor.size_hint()));
354 while let Some(e) = visitor.next_element()? {
355 vec.push(e);
356 }
357 Ok(Content::Seq(vec))
358 }
359
360 fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
361 where
362 V: MapAccess<'de>,
363 {
364 let mut vec = Vec::with_capacity(size_hint::cautious(visitor.size_hint()));
365 while let Some(kv) = visitor.next_entry()? {
366 vec.push(kv);
367 }
368 Ok(Content::Map(vec))
369 }
370
371 fn visit_enum<V>(self, _visitor: V) -> Result<Self::Value, V::Error>
372 where
373 V: EnumAccess<'de>,
374 {
375 Err(de::Error::custom(
376 "untagged and internally tagged enums do not support enum input",
377 ))
378 }
379}
380
381pub struct ContentDeserializer<'de, E> {
382 content: Content<'de>,
383 err: PhantomData<E>,
384}
385
386impl<'de, E> Deserializer<'de> for ContentDeserializer<'de, E>
387where
388 E: de::Error,
389{
390 type Error = E;
391
392 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
393 where
394 V: Visitor<'de>,
395 {
396 match self.content {
397 Content::Bool(v) => visitor.visit_bool(v),
398 Content::U8(v) => visitor.visit_u8(v),
399 Content::U16(v) => visitor.visit_u16(v),
400 Content::U32(v) => visitor.visit_u32(v),
401 Content::U64(v) => visitor.visit_u64(v),
402 Content::I8(v) => visitor.visit_i8(v),
403 Content::I16(v) => visitor.visit_i16(v),
404 Content::I32(v) => visitor.visit_i32(v),
405 Content::I64(v) => visitor.visit_i64(v),
406 Content::F32(v) => visitor.visit_f32(v),
407 Content::F64(v) => visitor.visit_f64(v),
408 Content::Char(v) => visitor.visit_char(v),
409 Content::String(v) => visitor.visit_string(v),
410 Content::Str(v) => visitor.visit_borrowed_str(v),
411 Content::ByteBuf(v) => visitor.visit_byte_buf(v),
412 Content::Bytes(v) => visitor.visit_borrowed_bytes(v),
413 Content::Unit => visitor.visit_unit(),
414 Content::None => visitor.visit_none(),
415 Content::Some(v) => visitor.visit_some(ContentDeserializer::new(*v)),
416 Content::Newtype(v) => visitor.visit_newtype_struct(ContentDeserializer::new(*v)),
417 Content::Seq(v) => {
418 let seq = v.into_iter().map(ContentDeserializer::new);
419 let mut seq_visitor = de::value::SeqDeserializer::new(seq);
420 let value = visitor.visit_seq(&mut seq_visitor)?;
421 seq_visitor.end()?;
422 Ok(value)
423 },
424 Content::Map(v) => {
425 let map = v.into_iter()
426 .map(|(k, v)| (ContentDeserializer::new(k), ContentDeserializer::new(v)));
427 let mut map_visitor = de::value::MapDeserializer::new(map);
428 let value = visitor.visit_map(&mut map_visitor)?;
429 map_visitor.end()?;
430 Ok(value)
431 },
432 }
433 }
434
435 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
436 where
437 V: Visitor<'de>,
438 {
439 match self.content {
440 Content::None => visitor.visit_none(),
441 Content::Some(v) => visitor.visit_some(ContentDeserializer::new(*v)),
442 Content::Unit => visitor.visit_unit(),
443 _ => visitor.visit_some(self),
444 }
445 }
446
447 fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, Self::Error>
448 where
449 V: Visitor<'de>,
450 {
451 visitor.visit_newtype_struct(self)
452 }
453
454 fn deserialize_enum<V>(
455 self,
456 _name: &str,
457 _variants: &'static [&'static str],
458 visitor: V,
459 ) -> Result<V::Value, Self::Error>
460 where
461 V: Visitor<'de>,
462 {
463 let (variant, value) = match self.content {
464 Content::Map(value) => {
465 let mut iter = value.into_iter();
466 let (variant, value) = match iter.next() {
467 Some(v) => v,
468 None => {
469 return Err(de::Error::invalid_value(
470 de::Unexpected::Map,
471 &"map with a single key",
472 ));
473 },
474 };
475 if iter.next().is_some() {
477 return Err(de::Error::invalid_value(
478 de::Unexpected::Map,
479 &"map with a single key",
480 ));
481 }
482 (variant, Some(value))
483 },
484 s @ Content::String(_) | s @ Content::Str(_) => (s, None),
485 other => {
486 return Err(de::Error::invalid_type(
487 other.unexpected(),
488 &"string or map",
489 ));
490 },
491 };
492
493 visitor.visit_enum(EnumDeserializer {
494 variant: variant,
495 value: value,
496 err: PhantomData,
497 })
498 }
499
500 fn deserialize_unit_struct<V>(
501 self,
502 _name: &'static str,
503 visitor: V,
504 ) -> Result<V::Value, Self::Error>
505 where
506 V: Visitor<'de>,
507 {
508 match self.content {
509 Content::Map(ref v) if v.is_empty() => visitor.visit_unit(),
524 Content::Seq(ref v) if v.is_empty() => visitor.visit_unit(),
525 _ => self.deserialize_any(visitor),
526 }
527 }
528
529 forward_to_deserialize_any! {
530 bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes
531 byte_buf unit seq tuple tuple_struct map struct identifier
532 ignored_any
533 }
534}
535
536impl<'de, E> ContentDeserializer<'de, E> {
537 pub fn new(content: Content<'de>) -> Self {
539 ContentDeserializer {
540 content: content,
541 err: PhantomData,
542 }
543 }
544}
545
546struct EnumDeserializer<'de, E>
547where
548 E: de::Error,
549{
550 variant: Content<'de>,
551 value: Option<Content<'de>>,
552 err: PhantomData<E>,
553}
554impl<'de, E> de::EnumAccess<'de> for EnumDeserializer<'de, E>
555where
556 E: de::Error,
557{
558 type Error = E;
559 type Variant = VariantDeserializer<'de, Self::Error>;
560
561 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), E>
562 where
563 V: de::DeserializeSeed<'de>,
564 {
565 let visitor = VariantDeserializer {
566 value: self.value,
567 err: PhantomData,
568 };
569 seed.deserialize(ContentDeserializer::new(self.variant))
570 .map(|v| (v, visitor))
571 }
572}
573
574struct VariantDeserializer<'de, E>
575where
576 E: de::Error,
577{
578 value: Option<Content<'de>>,
579 err: PhantomData<E>,
580}
581
582impl<'de, E> de::VariantAccess<'de> for VariantDeserializer<'de, E>
583where
584 E: de::Error,
585{
586 type Error = E;
587
588 fn unit_variant(self) -> Result<(), E> {
589 match self.value {
590 Some(value) => de::Deserialize::deserialize(ContentDeserializer::new(value)),
591 None => Ok(()),
592 }
593 }
594
595 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, E>
596 where
597 T: de::DeserializeSeed<'de>,
598 {
599 match self.value {
600 Some(value) => seed.deserialize(ContentDeserializer::new(value)),
601 None => Err(de::Error::invalid_type(
602 de::Unexpected::UnitVariant,
603 &"newtype variant",
604 )),
605 }
606 }
607
608 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
609 where
610 V: de::Visitor<'de>,
611 {
612 match self.value {
613 Some(Content::Seq(v)) => {
614 de::Deserializer::deserialize_any(SeqDeserializer::new(v), visitor)
615 },
616 Some(other) => Err(de::Error::invalid_type(
617 other.unexpected(),
618 &"tuple variant",
619 )),
620 None => Err(de::Error::invalid_type(
621 de::Unexpected::UnitVariant,
622 &"tuple variant",
623 )),
624 }
625 }
626
627 fn struct_variant<V>(
628 self,
629 _fields: &'static [&'static str],
630 visitor: V,
631 ) -> Result<V::Value, Self::Error>
632 where
633 V: de::Visitor<'de>,
634 {
635 match self.value {
636 Some(Content::Map(v)) => {
637 de::Deserializer::deserialize_any(MapDeserializer::new(v), visitor)
638 },
639 Some(Content::Seq(v)) => {
640 de::Deserializer::deserialize_any(SeqDeserializer::new(v), visitor)
641 },
642 Some(other) => Err(de::Error::invalid_type(
643 other.unexpected(),
644 &"struct variant",
645 )),
646 _ => Err(de::Error::invalid_type(
647 de::Unexpected::UnitVariant,
648 &"struct variant",
649 )),
650 }
651 }
652}
653
654struct SeqDeserializer<'de, E>
655where
656 E: de::Error,
657{
658 iter: <Vec<Content<'de>> as IntoIterator>::IntoIter,
659 err: PhantomData<E>,
660}
661
662impl<'de, E> SeqDeserializer<'de, E>
663where
664 E: de::Error,
665{
666 fn new(vec: Vec<Content<'de>>) -> Self {
667 SeqDeserializer {
668 iter: vec.into_iter(),
669 err: PhantomData,
670 }
671 }
672}
673
674impl<'de, E> de::Deserializer<'de> for SeqDeserializer<'de, E>
675where
676 E: de::Error,
677{
678 type Error = E;
679
680 #[inline]
681 fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
682 where
683 V: de::Visitor<'de>,
684 {
685 let len = self.iter.len();
686 if len == 0 {
687 visitor.visit_unit()
688 } else {
689 let ret = visitor.visit_seq(&mut self)?;
690 let remaining = self.iter.len();
691 if remaining == 0 {
692 Ok(ret)
693 } else {
694 Err(de::Error::invalid_length(len, &"fewer elements in array"))
695 }
696 }
697 }
698
699 forward_to_deserialize_any! {
700 bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes
701 byte_buf option unit unit_struct newtype_struct seq tuple
702 tuple_struct map struct enum identifier ignored_any
703 }
704}
705
706impl<'de, E> de::SeqAccess<'de> for SeqDeserializer<'de, E>
707where
708 E: de::Error,
709{
710 type Error = E;
711
712 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
713 where
714 T: de::DeserializeSeed<'de>,
715 {
716 match self.iter.next() {
717 Some(value) => seed.deserialize(ContentDeserializer::new(value)).map(Some),
718 None => Ok(None),
719 }
720 }
721
722 fn size_hint(&self) -> Option<usize> {
723 size_hint::from_bounds(&self.iter)
724 }
725}
726
727struct MapDeserializer<'de, E>
728where
729 E: de::Error,
730{
731 iter: <Vec<(Content<'de>, Content<'de>)> as IntoIterator>::IntoIter,
732 value: Option<Content<'de>>,
733 err: PhantomData<E>,
734}
735
736impl<'de, E> MapDeserializer<'de, E>
737where
738 E: de::Error,
739{
740 fn new(map: Vec<(Content<'de>, Content<'de>)>) -> Self {
741 MapDeserializer {
742 iter: map.into_iter(),
743 value: None,
744 err: PhantomData,
745 }
746 }
747}
748
749impl<'de, E> de::MapAccess<'de> for MapDeserializer<'de, E>
750where
751 E: de::Error,
752{
753 type Error = E;
754
755 fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
756 where
757 T: de::DeserializeSeed<'de>,
758 {
759 match self.iter.next() {
760 Some((key, value)) => {
761 self.value = Some(value);
762 seed.deserialize(ContentDeserializer::new(key)).map(Some)
763 },
764 None => Ok(None),
765 }
766 }
767
768 fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>
769 where
770 T: de::DeserializeSeed<'de>,
771 {
772 match self.value.take() {
773 Some(value) => seed.deserialize(ContentDeserializer::new(value)),
774 None => Err(de::Error::custom("value is missing")),
775 }
776 }
777
778 fn size_hint(&self) -> Option<usize> {
779 size_hint::from_bounds(&self.iter)
780 }
781}
782
783impl<'de, E> de::Deserializer<'de> for MapDeserializer<'de, E>
784where
785 E: de::Error,
786{
787 type Error = E;
788
789 #[inline]
790 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
791 where
792 V: de::Visitor<'de>,
793 {
794 visitor.visit_map(self)
795 }
796
797 forward_to_deserialize_any! {
798 bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes
799 byte_buf option unit unit_struct newtype_struct seq tuple
800 tuple_struct map struct enum identifier ignored_any
801 }
802}
803
804
805pub struct ContentRefDeserializer<'a, 'de: 'a, E> {
806 content: &'a Content<'de>,
807 err: PhantomData<E>,
808}
809
810impl<'de, 'a, E> Deserializer<'de> for ContentRefDeserializer<'a, 'de, E>
811where
812 E: de::Error,
813{
814 type Error = E;
815
816 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, E>
817 where
818 V: Visitor<'de>,
819 {
820 match *self.content {
821 Content::Bool(v) => visitor.visit_bool(v),
822 Content::U8(v) => visitor.visit_u8(v),
823 Content::U16(v) => visitor.visit_u16(v),
824 Content::U32(v) => visitor.visit_u32(v),
825 Content::U64(v) => visitor.visit_u64(v),
826 Content::I8(v) => visitor.visit_i8(v),
827 Content::I16(v) => visitor.visit_i16(v),
828 Content::I32(v) => visitor.visit_i32(v),
829 Content::I64(v) => visitor.visit_i64(v),
830 Content::F32(v) => visitor.visit_f32(v),
831 Content::F64(v) => visitor.visit_f64(v),
832 Content::Char(v) => visitor.visit_char(v),
833 Content::String(ref v) => visitor.visit_str(v),
834 Content::Str(v) => visitor.visit_borrowed_str(v),
835 Content::ByteBuf(ref v) => visitor.visit_bytes(v),
836 Content::Bytes(v) => visitor.visit_borrowed_bytes(v),
837 Content::Unit => visitor.visit_unit(),
838 Content::None => visitor.visit_none(),
839 Content::Some(ref v) => visitor.visit_some(ContentRefDeserializer::new(v)),
840 Content::Newtype(ref v) => visitor.visit_newtype_struct(ContentRefDeserializer::new(v)),
841 Content::Seq(ref v) => {
842 let seq = v.iter().map(ContentRefDeserializer::new);
843 let mut seq_visitor = de::value::SeqDeserializer::new(seq);
844 let value = visitor.visit_seq(&mut seq_visitor)?;
845 seq_visitor.end()?;
846 Ok(value)
847 },
848 Content::Map(ref v) => {
849 let map = v.iter().map(|(k, v)| {
850 (
851 ContentRefDeserializer::new(k),
852 ContentRefDeserializer::new(v),
853 )
854 });
855 let mut map_visitor = de::value::MapDeserializer::new(map);
856 let value = visitor.visit_map(&mut map_visitor)?;
857 map_visitor.end()?;
858 Ok(value)
859 },
860 }
861 }
862
863 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, E>
864 where
865 V: Visitor<'de>,
866 {
867 match *self.content {
868 Content::None => visitor.visit_none(),
869 Content::Some(ref v) => visitor.visit_some(ContentRefDeserializer::new(v)),
870 Content::Unit => visitor.visit_unit(),
871 _ => visitor.visit_some(self),
872 }
873 }
874
875 fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, E>
876 where
877 V: Visitor<'de>,
878 {
879 visitor.visit_newtype_struct(self)
880 }
881
882 fn deserialize_enum<V>(
883 self,
884 _name: &str,
885 _variants: &'static [&'static str],
886 visitor: V,
887 ) -> Result<V::Value, Self::Error>
888 where
889 V: Visitor<'de>,
890 {
891 let (variant, value) = match *self.content {
892 Content::Map(ref value) => {
893 let mut iter = value.iter();
894 let (variant, value) = match iter.next() {
895 Some(v) => v,
896 None => {
897 return Err(de::Error::invalid_value(
898 de::Unexpected::Map,
899 &"map with a single key",
900 ));
901 },
902 };
903 if iter.next().is_some() {
905 return Err(de::Error::invalid_value(
906 de::Unexpected::Map,
907 &"map with a single key",
908 ));
909 }
910 (variant, Some(value))
911 },
912 ref s @ Content::String(_) | ref s @ Content::Str(_) => (s, None),
913 ref other => {
914 return Err(de::Error::invalid_type(
915 other.unexpected(),
916 &"string or map",
917 ));
918 },
919 };
920
921 visitor.visit_enum(EnumRefDeserializer {
922 variant: variant,
923 value: value,
924 err: PhantomData,
925 })
926 }
927
928 forward_to_deserialize_any! {
929 bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes
930 byte_buf unit unit_struct seq tuple tuple_struct map struct
931 identifier ignored_any
932 }
933}
934
935impl<'a, 'de, E> ContentRefDeserializer<'a, 'de, E> {
936 pub fn new(content: &'a Content<'de>) -> Self {
937 ContentRefDeserializer {
938 content: content,
939 err: PhantomData,
940 }
941 }
942}
943
944struct EnumRefDeserializer<'a, 'de: 'a, E>
945where
946 E: de::Error,
947{
948 variant: &'a Content<'de>,
949 value: Option<&'a Content<'de>>,
950 err: PhantomData<E>,
951}
952
953impl<'de, 'a, E> de::EnumAccess<'de> for EnumRefDeserializer<'a, 'de, E>
954where
955 E: de::Error,
956{
957 type Error = E;
958 type Variant = VariantRefDeserializer<'a, 'de, Self::Error>;
959
960 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
961 where
962 V: de::DeserializeSeed<'de>,
963 {
964 let visitor = VariantRefDeserializer {
965 value: self.value,
966 err: PhantomData,
967 };
968 seed.deserialize(ContentRefDeserializer::new(self.variant))
969 .map(|v| (v, visitor))
970 }
971}
972
973struct VariantRefDeserializer<'a, 'de: 'a, E>
974where
975 E: de::Error,
976{
977 value: Option<&'a Content<'de>>,
978 err: PhantomData<E>,
979}
980
981impl<'de, 'a, E> de::VariantAccess<'de> for VariantRefDeserializer<'a, 'de, E>
982where
983 E: de::Error,
984{
985 type Error = E;
986
987 fn unit_variant(self) -> Result<(), E> {
988 match self.value {
989 Some(value) => de::Deserialize::deserialize(ContentRefDeserializer::new(value)),
990 None => Ok(()),
991 }
992 }
993
994 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, E>
995 where
996 T: de::DeserializeSeed<'de>,
997 {
998 match self.value {
999 Some(value) => seed.deserialize(ContentRefDeserializer::new(value)),
1000 None => Err(de::Error::invalid_type(
1001 de::Unexpected::UnitVariant,
1002 &"newtype variant",
1003 )),
1004 }
1005 }
1006
1007 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
1008 where
1009 V: de::Visitor<'de>,
1010 {
1011 match self.value {
1012 Some(Content::Seq(ref v)) => {
1013 de::Deserializer::deserialize_any(SeqRefDeserializer::new(v), visitor)
1014 },
1015 Some(other) => Err(de::Error::invalid_type(
1016 other.unexpected(),
1017 &"tuple variant",
1018 )),
1019 None => Err(de::Error::invalid_type(
1020 de::Unexpected::UnitVariant,
1021 &"tuple variant",
1022 )),
1023 }
1024 }
1025
1026 fn struct_variant<V>(
1027 self,
1028 _fields: &'static [&'static str],
1029 visitor: V,
1030 ) -> Result<V::Value, Self::Error>
1031 where
1032 V: de::Visitor<'de>,
1033 {
1034 match self.value {
1035 Some(Content::Map(ref v)) => {
1036 de::Deserializer::deserialize_any(MapRefDeserializer::new(v), visitor)
1037 },
1038 Some(Content::Seq(ref v)) => {
1039 de::Deserializer::deserialize_any(SeqRefDeserializer::new(v), visitor)
1040 },
1041 Some(other) => Err(de::Error::invalid_type(
1042 other.unexpected(),
1043 &"struct variant",
1044 )),
1045 _ => Err(de::Error::invalid_type(
1046 de::Unexpected::UnitVariant,
1047 &"struct variant",
1048 )),
1049 }
1050 }
1051}
1052
1053struct SeqRefDeserializer<'a, 'de: 'a, E>
1054where
1055 E: de::Error,
1056{
1057 iter: <&'a [Content<'de>] as IntoIterator>::IntoIter,
1058 err: PhantomData<E>,
1059}
1060
1061impl<'a, 'de, E> SeqRefDeserializer<'a, 'de, E>
1062where
1063 E: de::Error,
1064{
1065 fn new(vec: &'a [Content<'de>]) -> Self {
1066 SeqRefDeserializer {
1067 iter: vec.iter(),
1068 err: PhantomData,
1069 }
1070 }
1071}
1072
1073impl<'de, 'a, E> de::Deserializer<'de> for SeqRefDeserializer<'a, 'de, E>
1074where
1075 E: de::Error,
1076{
1077 type Error = E;
1078
1079 #[inline]
1080 fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
1081 where
1082 V: de::Visitor<'de>,
1083 {
1084 let len = self.iter.len();
1085 if len == 0 {
1086 visitor.visit_unit()
1087 } else {
1088 let ret = visitor.visit_seq(&mut self)?;
1089 let remaining = self.iter.len();
1090 if remaining == 0 {
1091 Ok(ret)
1092 } else {
1093 Err(de::Error::invalid_length(len, &"fewer elements in array"))
1094 }
1095 }
1096 }
1097
1098 forward_to_deserialize_any! {
1099 bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes
1100 byte_buf option unit unit_struct newtype_struct seq tuple
1101 tuple_struct map struct enum identifier ignored_any
1102 }
1103}
1104
1105impl<'de, 'a, E> de::SeqAccess<'de> for SeqRefDeserializer<'a, 'de, E>
1106where
1107 E: de::Error,
1108{
1109 type Error = E;
1110
1111 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
1112 where
1113 T: de::DeserializeSeed<'de>,
1114 {
1115 match self.iter.next() {
1116 Some(value) => seed.deserialize(ContentRefDeserializer::new(value))
1117 .map(Some),
1118 None => Ok(None),
1119 }
1120 }
1121
1122 fn size_hint(&self) -> Option<usize> {
1123 size_hint::from_bounds(&self.iter)
1124 }
1125}
1126
1127struct MapRefDeserializer<'a, 'de: 'a, E>
1128where
1129 E: de::Error,
1130{
1131 iter: <&'a [(Content<'de>, Content<'de>)] as IntoIterator>::IntoIter,
1132 value: Option<&'a Content<'de>>,
1133 err: PhantomData<E>,
1134}
1135
1136impl<'a, 'de, E> MapRefDeserializer<'a, 'de, E>
1137where
1138 E: de::Error,
1139{
1140 fn new(map: &'a [(Content<'de>, Content<'de>)]) -> Self {
1141 MapRefDeserializer {
1142 iter: map.iter(),
1143 value: None,
1144 err: PhantomData,
1145 }
1146 }
1147}
1148
1149impl<'de, 'a, E> de::MapAccess<'de> for MapRefDeserializer<'a, 'de, E>
1150where
1151 E: de::Error,
1152{
1153 type Error = E;
1154
1155 fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
1156 where
1157 T: de::DeserializeSeed<'de>,
1158 {
1159 match self.iter.next() {
1160 Some((key, value)) => {
1161 self.value = Some(value);
1162 seed.deserialize(ContentRefDeserializer::new(key)).map(Some)
1163 },
1164 None => Ok(None),
1165 }
1166 }
1167
1168 fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>
1169 where
1170 T: de::DeserializeSeed<'de>,
1171 {
1172 match self.value.take() {
1173 Some(value) => seed.deserialize(ContentRefDeserializer::new(value)),
1174 None => Err(de::Error::custom("value is missing")),
1175 }
1176 }
1177
1178 fn size_hint(&self) -> Option<usize> {
1179 size_hint::from_bounds(&self.iter)
1180 }
1181}
1182
1183impl<'de, 'a, E> de::Deserializer<'de> for MapRefDeserializer<'a, 'de, E>
1184where
1185 E: de::Error,
1186{
1187 type Error = E;
1188
1189 #[inline]
1190 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1191 where
1192 V: de::Visitor<'de>,
1193 {
1194 visitor.visit_map(self)
1195 }
1196
1197 forward_to_deserialize_any! {
1198 bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes
1199 byte_buf option unit unit_struct newtype_struct seq tuple
1200 tuple_struct map struct enum identifier ignored_any
1201 }
1202}
1203
1204impl<'de, E> de::IntoDeserializer<'de, E> for ContentDeserializer<'de, E>
1205where
1206 E: de::Error,
1207{
1208 type Deserializer = Self;
1209
1210 fn into_deserializer(self) -> Self {
1211 self
1212 }
1213}
1214
1215impl<'de, 'a, E> de::IntoDeserializer<'de, E> for ContentRefDeserializer<'a, 'de, E>
1216where
1217 E: de::Error,
1218{
1219 type Deserializer = Self;
1220
1221 fn into_deserializer(self) -> Self {
1222 self
1223 }
1224}