1 // This module is doc(hidden) and nothing here should be used outside of
2 // generated code.
3 //
4 // We will iterate on the implementation for a few releases and only have to
5 // worry about backward compatibility for the `untagged` and `tag` attributes
6 // rather than for this entire mechanism.
7 //
8 // This issue is tracking making some of this stuff public:
9 // https://github.com/serde-rs/serde/issues/741
10 
11 #![doc(hidden)]
12 
13 use core::cmp;
14 use core::fmt;
15 use core::marker::PhantomData;
16 
17 #[cfg(all(not(feature = "std"), feature = "collections"))]
18 use collections::{String, Vec};
19 
20 #[cfg(all(feature = "alloc", not(feature = "std")))]
21 use alloc::boxed::Box;
22 
23 use de::{self, Deserialize, DeserializeSeed, Deserializer, Visitor, SeqVisitor, MapVisitor,
24          EnumVisitor, Unexpected};
25 
26 /// Used from generated code to buffer the contents of the Deserializer when
27 /// deserializing untagged enums and internally tagged enums.
28 ///
29 /// Not public API. Use serde-value instead.
30 #[derive(Debug)]
31 pub enum Content {
32     Bool(bool),
33 
34     U8(u8),
35     U16(u16),
36     U32(u32),
37     U64(u64),
38 
39     I8(i8),
40     I16(i16),
41     I32(i32),
42     I64(i64),
43 
44     F32(f32),
45     F64(f64),
46 
47     Char(char),
48     String(String),
49     Bytes(Vec<u8>),
50 
51     None,
52     Some(Box<Content>),
53 
54     Unit,
55     Newtype(Box<Content>),
56     Seq(Vec<Content>),
57     Map(Vec<(Content, Content)>),
58 }
59 
60 impl Content {
unexpected(&self) -> Unexpected61     fn unexpected(&self) -> Unexpected {
62         match *self {
63             Content::Bool(b) => Unexpected::Bool(b),
64             Content::U8(n) => Unexpected::Unsigned(n as u64),
65             Content::U16(n) => Unexpected::Unsigned(n as u64),
66             Content::U32(n) => Unexpected::Unsigned(n as u64),
67             Content::U64(n) => Unexpected::Unsigned(n),
68             Content::I8(n) => Unexpected::Signed(n as i64),
69             Content::I16(n) => Unexpected::Signed(n as i64),
70             Content::I32(n) => Unexpected::Signed(n as i64),
71             Content::I64(n) => Unexpected::Signed(n),
72             Content::F32(f) => Unexpected::Float(f as f64),
73             Content::F64(f) => Unexpected::Float(f),
74             Content::Char(c) => Unexpected::Char(c),
75             Content::String(ref s) => Unexpected::Str(s),
76             Content::Bytes(ref b) => Unexpected::Bytes(b),
77             Content::None | Content::Some(_) => Unexpected::Option,
78             Content::Unit => Unexpected::Unit,
79             Content::Newtype(_) => Unexpected::NewtypeStruct,
80             Content::Seq(_) => Unexpected::Seq,
81             Content::Map(_) => Unexpected::Map,
82         }
83     }
84 }
85 
86 impl Deserialize for Content {
deserialize<D: Deserializer>(deserializer: D) -> Result<Self, D::Error>87     fn deserialize<D: Deserializer>(deserializer: D) -> Result<Self, D::Error> {
88         // Untagged and internally tagged enums are only supported in
89         // self-describing formats.
90         deserializer.deserialize(ContentVisitor)
91     }
92 }
93 
94 struct ContentVisitor;
95 
96 impl Visitor for ContentVisitor {
97     type Value = Content;
98 
expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result99     fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
100         fmt.write_str("any value")
101     }
102 
visit_bool<F>(self, value: bool) -> Result<Self::Value, F> where F: de::Error103     fn visit_bool<F>(self, value: bool) -> Result<Self::Value, F>
104         where F: de::Error
105     {
106         Ok(Content::Bool(value))
107     }
108 
visit_i8<F>(self, value: i8) -> Result<Self::Value, F> where F: de::Error109     fn visit_i8<F>(self, value: i8) -> Result<Self::Value, F>
110         where F: de::Error
111     {
112         Ok(Content::I8(value))
113     }
114 
visit_i16<F>(self, value: i16) -> Result<Self::Value, F> where F: de::Error115     fn visit_i16<F>(self, value: i16) -> Result<Self::Value, F>
116         where F: de::Error
117     {
118         Ok(Content::I16(value))
119     }
120 
visit_i32<F>(self, value: i32) -> Result<Self::Value, F> where F: de::Error121     fn visit_i32<F>(self, value: i32) -> Result<Self::Value, F>
122         where F: de::Error
123     {
124         Ok(Content::I32(value))
125     }
126 
visit_i64<F>(self, value: i64) -> Result<Self::Value, F> where F: de::Error127     fn visit_i64<F>(self, value: i64) -> Result<Self::Value, F>
128         where F: de::Error
129     {
130         Ok(Content::I64(value))
131     }
132 
visit_u8<F>(self, value: u8) -> Result<Self::Value, F> where F: de::Error133     fn visit_u8<F>(self, value: u8) -> Result<Self::Value, F>
134         where F: de::Error
135     {
136         Ok(Content::U8(value))
137     }
138 
visit_u16<F>(self, value: u16) -> Result<Self::Value, F> where F: de::Error139     fn visit_u16<F>(self, value: u16) -> Result<Self::Value, F>
140         where F: de::Error
141     {
142         Ok(Content::U16(value))
143     }
144 
visit_u32<F>(self, value: u32) -> Result<Self::Value, F> where F: de::Error145     fn visit_u32<F>(self, value: u32) -> Result<Self::Value, F>
146         where F: de::Error
147     {
148         Ok(Content::U32(value))
149     }
150 
visit_u64<F>(self, value: u64) -> Result<Self::Value, F> where F: de::Error151     fn visit_u64<F>(self, value: u64) -> Result<Self::Value, F>
152         where F: de::Error
153     {
154         Ok(Content::U64(value))
155     }
156 
visit_f32<F>(self, value: f32) -> Result<Self::Value, F> where F: de::Error157     fn visit_f32<F>(self, value: f32) -> Result<Self::Value, F>
158         where F: de::Error
159     {
160         Ok(Content::F32(value))
161     }
162 
visit_f64<F>(self, value: f64) -> Result<Self::Value, F> where F: de::Error163     fn visit_f64<F>(self, value: f64) -> Result<Self::Value, F>
164         where F: de::Error
165     {
166         Ok(Content::F64(value))
167     }
168 
visit_char<F>(self, value: char) -> Result<Self::Value, F> where F: de::Error169     fn visit_char<F>(self, value: char) -> Result<Self::Value, F>
170         where F: de::Error
171     {
172         Ok(Content::Char(value))
173     }
174 
visit_str<F>(self, value: &str) -> Result<Self::Value, F> where F: de::Error175     fn visit_str<F>(self, value: &str) -> Result<Self::Value, F>
176         where F: de::Error
177     {
178         Ok(Content::String(value.into()))
179     }
180 
visit_string<F>(self, value: String) -> Result<Self::Value, F> where F: de::Error181     fn visit_string<F>(self, value: String) -> Result<Self::Value, F>
182         where F: de::Error
183     {
184         Ok(Content::String(value))
185     }
186 
visit_bytes<F>(self, value: &[u8]) -> Result<Self::Value, F> where F: de::Error187     fn visit_bytes<F>(self, value: &[u8]) -> Result<Self::Value, F>
188         where F: de::Error
189     {
190         Ok(Content::Bytes(value.into()))
191     }
192 
visit_byte_buf<F>(self, value: Vec<u8>) -> Result<Self::Value, F> where F: de::Error193     fn visit_byte_buf<F>(self, value: Vec<u8>) -> Result<Self::Value, F>
194         where F: de::Error
195     {
196         Ok(Content::Bytes(value))
197     }
198 
visit_unit<F>(self) -> Result<Self::Value, F> where F: de::Error199     fn visit_unit<F>(self) -> Result<Self::Value, F>
200         where F: de::Error
201     {
202         Ok(Content::Unit)
203     }
204 
visit_none<F>(self) -> Result<Self::Value, F> where F: de::Error205     fn visit_none<F>(self) -> Result<Self::Value, F>
206         where F: de::Error
207     {
208         Ok(Content::None)
209     }
210 
visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer211     fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
212         where D: Deserializer
213     {
214         Deserialize::deserialize(deserializer).map(|v| Content::Some(Box::new(v)))
215     }
216 
visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer217     fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
218         where D: Deserializer
219     {
220         Deserialize::deserialize(deserializer).map(|v| Content::Newtype(Box::new(v)))
221     }
222 
visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error> where V: SeqVisitor223     fn visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
224         where V: SeqVisitor
225     {
226         let mut vec = Vec::with_capacity(cmp::min(visitor.size_hint().0, 4096));
227         while let Some(e) = try!(visitor.visit()) {
228             vec.push(e);
229         }
230         Ok(Content::Seq(vec))
231     }
232 
visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error> where V: MapVisitor233     fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
234         where V: MapVisitor
235     {
236         let mut vec = Vec::with_capacity(cmp::min(visitor.size_hint().0, 4096));
237         while let Some(kv) = try!(visitor.visit()) {
238             vec.push(kv);
239         }
240         Ok(Content::Map(vec))
241     }
242 
visit_enum<V>(self, _visitor: V) -> Result<Self::Value, V::Error> where V: EnumVisitor243     fn visit_enum<V>(self, _visitor: V) -> Result<Self::Value, V::Error>
244         where V: EnumVisitor
245     {
246         Err(de::Error::custom("untagged and internally tagged enums do not support enum input"))
247     }
248 }
249 
250 /// This is the type of the map keys in an internally tagged enum.
251 ///
252 /// Not public API.
253 pub enum TagOrContent {
254     Tag,
255     Content(Content),
256 }
257 
258 struct TagOrContentVisitor {
259     name: &'static str,
260 }
261 
262 impl TagOrContentVisitor {
new(name: &'static str) -> Self263     fn new(name: &'static str) -> Self {
264         TagOrContentVisitor { name: name }
265     }
266 }
267 
268 impl DeserializeSeed for TagOrContentVisitor {
269     type Value = TagOrContent;
270 
deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer271     fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
272         where D: Deserializer
273     {
274         // Internally tagged enums are only supported in self-describing
275         // formats.
276         deserializer.deserialize(self)
277     }
278 }
279 
280 impl Visitor for TagOrContentVisitor {
281     type Value = TagOrContent;
282 
expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result283     fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
284         write!(fmt, "a type tag `{}` or any other value", self.name)
285     }
286 
visit_bool<F>(self, value: bool) -> Result<Self::Value, F> where F: de::Error287     fn visit_bool<F>(self, value: bool) -> Result<Self::Value, F>
288         where F: de::Error
289     {
290         ContentVisitor.visit_bool(value).map(TagOrContent::Content)
291     }
292 
visit_i8<F>(self, value: i8) -> Result<Self::Value, F> where F: de::Error293     fn visit_i8<F>(self, value: i8) -> Result<Self::Value, F>
294         where F: de::Error
295     {
296         ContentVisitor.visit_i8(value).map(TagOrContent::Content)
297     }
298 
visit_i16<F>(self, value: i16) -> Result<Self::Value, F> where F: de::Error299     fn visit_i16<F>(self, value: i16) -> Result<Self::Value, F>
300         where F: de::Error
301     {
302         ContentVisitor.visit_i16(value).map(TagOrContent::Content)
303     }
304 
visit_i32<F>(self, value: i32) -> Result<Self::Value, F> where F: de::Error305     fn visit_i32<F>(self, value: i32) -> Result<Self::Value, F>
306         where F: de::Error
307     {
308         ContentVisitor.visit_i32(value).map(TagOrContent::Content)
309     }
310 
visit_i64<F>(self, value: i64) -> Result<Self::Value, F> where F: de::Error311     fn visit_i64<F>(self, value: i64) -> Result<Self::Value, F>
312         where F: de::Error
313     {
314         ContentVisitor.visit_i64(value).map(TagOrContent::Content)
315     }
316 
visit_u8<F>(self, value: u8) -> Result<Self::Value, F> where F: de::Error317     fn visit_u8<F>(self, value: u8) -> Result<Self::Value, F>
318         where F: de::Error
319     {
320         ContentVisitor.visit_u8(value).map(TagOrContent::Content)
321     }
322 
visit_u16<F>(self, value: u16) -> Result<Self::Value, F> where F: de::Error323     fn visit_u16<F>(self, value: u16) -> Result<Self::Value, F>
324         where F: de::Error
325     {
326         ContentVisitor.visit_u16(value).map(TagOrContent::Content)
327     }
328 
visit_u32<F>(self, value: u32) -> Result<Self::Value, F> where F: de::Error329     fn visit_u32<F>(self, value: u32) -> Result<Self::Value, F>
330         where F: de::Error
331     {
332         ContentVisitor.visit_u32(value).map(TagOrContent::Content)
333     }
334 
visit_u64<F>(self, value: u64) -> Result<Self::Value, F> where F: de::Error335     fn visit_u64<F>(self, value: u64) -> Result<Self::Value, F>
336         where F: de::Error
337     {
338         ContentVisitor.visit_u64(value).map(TagOrContent::Content)
339     }
340 
visit_f32<F>(self, value: f32) -> Result<Self::Value, F> where F: de::Error341     fn visit_f32<F>(self, value: f32) -> Result<Self::Value, F>
342         where F: de::Error
343     {
344         ContentVisitor.visit_f32(value).map(TagOrContent::Content)
345     }
346 
visit_f64<F>(self, value: f64) -> Result<Self::Value, F> where F: de::Error347     fn visit_f64<F>(self, value: f64) -> Result<Self::Value, F>
348         where F: de::Error
349     {
350         ContentVisitor.visit_f64(value).map(TagOrContent::Content)
351     }
352 
visit_char<F>(self, value: char) -> Result<Self::Value, F> where F: de::Error353     fn visit_char<F>(self, value: char) -> Result<Self::Value, F>
354         where F: de::Error
355     {
356         ContentVisitor.visit_char(value).map(TagOrContent::Content)
357     }
358 
visit_str<F>(self, value: &str) -> Result<Self::Value, F> where F: de::Error359     fn visit_str<F>(self, value: &str) -> Result<Self::Value, F>
360         where F: de::Error
361     {
362         if value == self.name {
363             Ok(TagOrContent::Tag)
364         } else {
365             ContentVisitor.visit_str(value).map(TagOrContent::Content)
366         }
367     }
368 
visit_string<F>(self, value: String) -> Result<Self::Value, F> where F: de::Error369     fn visit_string<F>(self, value: String) -> Result<Self::Value, F>
370         where F: de::Error
371     {
372         if value == self.name {
373             Ok(TagOrContent::Tag)
374         } else {
375             ContentVisitor.visit_string(value).map(TagOrContent::Content)
376         }
377     }
378 
visit_bytes<F>(self, value: &[u8]) -> Result<Self::Value, F> where F: de::Error379     fn visit_bytes<F>(self, value: &[u8]) -> Result<Self::Value, F>
380         where F: de::Error
381     {
382         if value == self.name.as_bytes() {
383             Ok(TagOrContent::Tag)
384         } else {
385             ContentVisitor.visit_bytes(value).map(TagOrContent::Content)
386         }
387     }
388 
visit_byte_buf<F>(self, value: Vec<u8>) -> Result<Self::Value, F> where F: de::Error389     fn visit_byte_buf<F>(self, value: Vec<u8>) -> Result<Self::Value, F>
390         where F: de::Error
391     {
392         if value == self.name.as_bytes() {
393             Ok(TagOrContent::Tag)
394         } else {
395             ContentVisitor.visit_byte_buf(value).map(TagOrContent::Content)
396         }
397     }
398 
visit_unit<F>(self) -> Result<Self::Value, F> where F: de::Error399     fn visit_unit<F>(self) -> Result<Self::Value, F>
400         where F: de::Error
401     {
402         ContentVisitor.visit_unit().map(TagOrContent::Content)
403     }
404 
visit_none<F>(self) -> Result<Self::Value, F> where F: de::Error405     fn visit_none<F>(self) -> Result<Self::Value, F>
406         where F: de::Error
407     {
408         ContentVisitor.visit_none().map(TagOrContent::Content)
409     }
410 
visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer411     fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
412         where D: Deserializer
413     {
414         ContentVisitor.visit_some(deserializer).map(TagOrContent::Content)
415     }
416 
visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer417     fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
418         where D: Deserializer
419     {
420         ContentVisitor.visit_newtype_struct(deserializer).map(TagOrContent::Content)
421     }
422 
visit_seq<V>(self, visitor: V) -> Result<Self::Value, V::Error> where V: SeqVisitor423     fn visit_seq<V>(self, visitor: V) -> Result<Self::Value, V::Error>
424         where V: SeqVisitor
425     {
426         ContentVisitor.visit_seq(visitor).map(TagOrContent::Content)
427     }
428 
visit_map<V>(self, visitor: V) -> Result<Self::Value, V::Error> where V: MapVisitor429     fn visit_map<V>(self, visitor: V) -> Result<Self::Value, V::Error>
430         where V: MapVisitor
431     {
432         ContentVisitor.visit_map(visitor).map(TagOrContent::Content)
433     }
434 
visit_enum<V>(self, visitor: V) -> Result<Self::Value, V::Error> where V: EnumVisitor435     fn visit_enum<V>(self, visitor: V) -> Result<Self::Value, V::Error>
436         where V: EnumVisitor
437     {
438         ContentVisitor.visit_enum(visitor).map(TagOrContent::Content)
439     }
440 }
441 
442 /// Used by generated code to deserialize an internally tagged enum.
443 ///
444 /// Not public API.
445 pub struct TaggedContent<T> {
446     pub tag: T,
447     pub content: Content,
448 }
449 
450 /// Not public API.
451 pub struct TaggedContentVisitor<T> {
452     tag_name: &'static str,
453     tag: PhantomData<T>,
454 }
455 
456 impl<T> TaggedContentVisitor<T> {
457     /// Visitor for the content of an internally tagged enum with the given tag
458     /// name.
new(name: &'static str) -> Self459     pub fn new(name: &'static str) -> Self {
460         TaggedContentVisitor {
461             tag_name: name,
462             tag: PhantomData,
463         }
464     }
465 }
466 
467 impl<T> DeserializeSeed for TaggedContentVisitor<T>
468     where T: Deserialize
469 {
470     type Value = TaggedContent<T>;
471 
deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer472     fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
473         where D: Deserializer
474     {
475         // Internally tagged enums are only supported in self-describing
476         // formats.
477         deserializer.deserialize(self)
478     }
479 }
480 
481 impl<T> Visitor for TaggedContentVisitor<T>
482     where T: Deserialize
483 {
484     type Value = TaggedContent<T>;
485 
expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result486     fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
487         fmt.write_str("any value")
488     }
489 
visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error> where V: MapVisitor490     fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
491         where V: MapVisitor
492     {
493         let mut tag = None;
494         let mut vec = Vec::with_capacity(cmp::min(visitor.size_hint().0, 4096));
495         while let Some(k) = try!(visitor.visit_key_seed(TagOrContentVisitor::new(self.tag_name))) {
496             match k {
497                 TagOrContent::Tag => {
498                     if tag.is_some() {
499                         return Err(de::Error::duplicate_field(self.tag_name));
500                     }
501                     tag = Some(try!(visitor.visit_value()));
502                 }
503                 TagOrContent::Content(k) => {
504                     let v = try!(visitor.visit_value());
505                     vec.push((k, v));
506                 }
507             }
508         }
509         match tag {
510             None => Err(de::Error::missing_field(self.tag_name)),
511             Some(tag) => {
512                 Ok(TaggedContent {
513                        tag: tag,
514                        content: Content::Map(vec),
515                    })
516             }
517         }
518     }
519 }
520 
521 /// Used by generated code to deserialize an adjacently tagged enum.
522 ///
523 /// Not public API.
524 pub enum TagOrContentField {
525     Tag,
526     Content,
527 }
528 
529 /// Not public API.
530 pub struct TagOrContentFieldVisitor {
531     pub tag: &'static str,
532     pub content: &'static str,
533 }
534 
535 impl DeserializeSeed for TagOrContentFieldVisitor {
536     type Value = TagOrContentField;
537 
deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: Deserializer538     fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
539         where D: Deserializer
540     {
541         deserializer.deserialize_str(self)
542     }
543 }
544 
545 impl Visitor for TagOrContentFieldVisitor {
546     type Value = TagOrContentField;
547 
expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result548     fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
549         write!(formatter, "{:?} or {:?}", self.tag, self.content)
550     }
551 
visit_str<E>(self, field: &str) -> Result<Self::Value, E> where E: de::Error552     fn visit_str<E>(self, field: &str) -> Result<Self::Value, E>
553         where E: de::Error
554     {
555         if field == self.tag {
556             Ok(TagOrContentField::Tag)
557         } else if field == self.content {
558             Ok(TagOrContentField::Content)
559         } else {
560             Err(de::Error::invalid_value(Unexpected::Str(field), &self))
561         }
562     }
563 }
564 
565 /// Not public API
566 pub struct ContentDeserializer<E> {
567     content: Content,
568     err: PhantomData<E>,
569 }
570 
571 /// Used when deserializing an internally tagged enum because the content will
572 /// be used exactly once.
573 impl<E> Deserializer for ContentDeserializer<E>
574     where E: de::Error
575 {
576     type Error = E;
577 
deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor578     fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error>
579         where V: Visitor
580     {
581         match self.content {
582             Content::Bool(v) => visitor.visit_bool(v),
583             Content::U8(v) => visitor.visit_u8(v),
584             Content::U16(v) => visitor.visit_u16(v),
585             Content::U32(v) => visitor.visit_u32(v),
586             Content::U64(v) => visitor.visit_u64(v),
587             Content::I8(v) => visitor.visit_i8(v),
588             Content::I16(v) => visitor.visit_i16(v),
589             Content::I32(v) => visitor.visit_i32(v),
590             Content::I64(v) => visitor.visit_i64(v),
591             Content::F32(v) => visitor.visit_f32(v),
592             Content::F64(v) => visitor.visit_f64(v),
593             Content::Char(v) => visitor.visit_char(v),
594             Content::String(v) => visitor.visit_string(v),
595             Content::Unit => visitor.visit_unit(),
596             Content::None => visitor.visit_none(),
597             Content::Some(v) => visitor.visit_some(ContentDeserializer::new(*v)),
598             Content::Newtype(v) => visitor.visit_newtype_struct(ContentDeserializer::new(*v)),
599             Content::Seq(v) => {
600                 let seq = v.into_iter().map(ContentDeserializer::new);
601                 let mut seq_visitor = de::value::SeqDeserializer::new(seq);
602                 let value = try!(visitor.visit_seq(&mut seq_visitor));
603                 try!(seq_visitor.end());
604                 Ok(value)
605             }
606             Content::Map(v) => {
607                 let map = v.into_iter().map(|(k, v)| {
608                                                 (ContentDeserializer::new(k),
609                                                  ContentDeserializer::new(v))
610                                             });
611                 let mut map_visitor = de::value::MapDeserializer::new(map);
612                 let value = try!(visitor.visit_map(&mut map_visitor));
613                 try!(map_visitor.end());
614                 Ok(value)
615             }
616             Content::Bytes(v) => visitor.visit_byte_buf(v),
617         }
618     }
619 
deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor620     fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
621         where V: Visitor
622     {
623         match self.content {
624             Content::None => visitor.visit_none(),
625             Content::Some(v) => visitor.visit_some(ContentDeserializer::new(*v)),
626             Content::Unit => visitor.visit_unit(),
627             _ => visitor.visit_some(self),
628         }
629     }
630 
deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, Self::Error> where V: Visitor631     fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, Self::Error>
632         where V: Visitor
633     {
634         visitor.visit_newtype_struct(self)
635     }
636 
deserialize_enum<V>(self, _name: &str, _variants: &'static [&'static str], visitor: V) -> Result<V::Value, Self::Error> where V: Visitor637     fn deserialize_enum<V>(self,
638                            _name: &str,
639                            _variants: &'static [&'static str],
640                            visitor: V)
641                            -> Result<V::Value, Self::Error>
642         where V: Visitor
643     {
644         let (variant, value) = match self.content {
645             Content::Map(value) => {
646                 let mut iter = value.into_iter();
647                 let (variant, value) = match iter.next() {
648                     Some(v) => v,
649                     None => {
650                         return Err(de::Error::invalid_value(de::Unexpected::Map,
651                                                             &"map with a single key"));
652                     }
653                 };
654                 // enums are encoded in json as maps with a single key:value pair
655                 if iter.next().is_some() {
656                     return Err(de::Error::invalid_value(de::Unexpected::Map,
657                                                         &"map with a single key"));
658                 }
659                 (variant, Some(value))
660             }
661             Content::String(variant) => (Content::String(variant), None),
662             other => {
663                 return Err(de::Error::invalid_type(other.unexpected(), &"string or map"));
664             }
665         };
666 
667         visitor.visit_enum(EnumDeserializer {
668                                variant: variant,
669                                value: value,
670                                err: PhantomData,
671                            })
672     }
673 
674     forward_to_deserialize! {
675         bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq
676         seq_fixed_size bytes byte_buf map unit_struct tuple_struct struct
677         struct_field tuple ignored_any
678     }
679 }
680 
681 impl<E> ContentDeserializer<E> {
682     /// private API, don't use
new(content: Content) -> Self683     pub fn new(content: Content) -> Self {
684         ContentDeserializer {
685             content: content,
686             err: PhantomData,
687         }
688     }
689 }
690 
691 struct EnumDeserializer<E>
692     where E: de::Error
693 {
694     variant: Content,
695     value: Option<Content>,
696     err: PhantomData<E>,
697 }
698 
699 impl<E> de::EnumVisitor for EnumDeserializer<E>
700     where E: de::Error
701 {
702     type Error = E;
703     type Variant = VariantDeserializer<Self::Error>;
704 
visit_variant_seed<V>(self, seed: V) -> Result<(V::Value, VariantDeserializer<E>), Self::Error> where V: de::DeserializeSeed705     fn visit_variant_seed<V>(self,
706                              seed: V)
707                              -> Result<(V::Value, VariantDeserializer<E>), Self::Error>
708         where V: de::DeserializeSeed
709     {
710         let visitor = VariantDeserializer {
711             value: self.value,
712             err: PhantomData,
713         };
714         seed.deserialize(ContentDeserializer::new(self.variant)).map(|v| (v, visitor))
715     }
716 }
717 
718 struct VariantDeserializer<E>
719     where E: de::Error
720 {
721     value: Option<Content>,
722     err: PhantomData<E>,
723 }
724 
725 impl<E> de::VariantVisitor for VariantDeserializer<E>
726     where E: de::Error
727 {
728     type Error = E;
729 
visit_unit(self) -> Result<(), E>730     fn visit_unit(self) -> Result<(), E> {
731         match self.value {
732             Some(value) => de::Deserialize::deserialize(ContentDeserializer::new(value)),
733             None => Ok(()),
734         }
735     }
736 
visit_newtype_seed<T>(self, seed: T) -> Result<T::Value, E> where T: de::DeserializeSeed737     fn visit_newtype_seed<T>(self, seed: T) -> Result<T::Value, E>
738         where T: de::DeserializeSeed
739     {
740         match self.value {
741             Some(value) => seed.deserialize(ContentDeserializer::new(value)),
742             None => Err(de::Error::invalid_type(de::Unexpected::UnitVariant, &"newtype variant")),
743         }
744     }
745 
visit_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor746     fn visit_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
747         where V: de::Visitor
748     {
749         match self.value {
750             Some(Content::Seq(v)) => {
751                 de::Deserializer::deserialize(SeqDeserializer::new(v), visitor)
752             }
753             Some(other) => Err(de::Error::invalid_type(other.unexpected(), &"tuple variant")),
754             None => Err(de::Error::invalid_type(de::Unexpected::UnitVariant, &"tuple variant")),
755         }
756     }
757 
visit_struct<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor758     fn visit_struct<V>(self,
759                        _fields: &'static [&'static str],
760                        visitor: V)
761                        -> Result<V::Value, Self::Error>
762         where V: de::Visitor
763     {
764         match self.value {
765             Some(Content::Map(v)) => {
766                 de::Deserializer::deserialize(MapDeserializer::new(v), visitor)
767             }
768             Some(other) => Err(de::Error::invalid_type(other.unexpected(), &"struct variant")),
769             _ => Err(de::Error::invalid_type(de::Unexpected::UnitVariant, &"struct variant")),
770         }
771     }
772 }
773 
774 struct SeqDeserializer<E>
775     where E: de::Error
776 {
777     iter: <Vec<Content> as IntoIterator>::IntoIter,
778     err: PhantomData<E>,
779 }
780 
781 impl<E> SeqDeserializer<E>
782     where E: de::Error
783 {
new(vec: Vec<Content>) -> Self784     fn new(vec: Vec<Content>) -> Self {
785         SeqDeserializer {
786             iter: vec.into_iter(),
787             err: PhantomData,
788         }
789     }
790 }
791 
792 impl<E> de::Deserializer for SeqDeserializer<E>
793     where E: de::Error
794 {
795     type Error = E;
796 
797     #[inline]
deserialize<V>(mut self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor798     fn deserialize<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
799         where V: de::Visitor
800     {
801         let len = self.iter.len();
802         if len == 0 {
803             visitor.visit_unit()
804         } else {
805             let ret = try!(visitor.visit_seq(&mut self));
806             let remaining = self.iter.len();
807             if remaining == 0 {
808                 Ok(ret)
809             } else {
810                 Err(de::Error::invalid_length(len, &"fewer elements in array"))
811             }
812         }
813     }
814 
815     forward_to_deserialize! {
816         bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option
817         seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct
818         tuple_struct struct struct_field tuple enum ignored_any
819     }
820 }
821 
822 impl<E> de::SeqVisitor for SeqDeserializer<E>
823     where E: de::Error
824 {
825     type Error = E;
826 
visit_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> where T: de::DeserializeSeed827     fn visit_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
828         where T: de::DeserializeSeed
829     {
830         match self.iter.next() {
831             Some(value) => seed.deserialize(ContentDeserializer::new(value)).map(Some),
832             None => Ok(None),
833         }
834     }
835 
size_hint(&self) -> (usize, Option<usize>)836     fn size_hint(&self) -> (usize, Option<usize>) {
837         self.iter.size_hint()
838     }
839 }
840 
841 struct MapDeserializer<E>
842     where E: de::Error
843 {
844     iter: <Vec<(Content, Content)> as IntoIterator>::IntoIter,
845     value: Option<Content>,
846     err: PhantomData<E>,
847 }
848 
849 impl<E> MapDeserializer<E>
850     where E: de::Error
851 {
new(map: Vec<(Content, Content)>) -> Self852     fn new(map: Vec<(Content, Content)>) -> Self {
853         MapDeserializer {
854             iter: map.into_iter(),
855             value: None,
856             err: PhantomData,
857         }
858     }
859 }
860 
861 impl<E> de::MapVisitor for MapDeserializer<E>
862     where E: de::Error
863 {
864     type Error = E;
865 
visit_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> where T: de::DeserializeSeed866     fn visit_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
867         where T: de::DeserializeSeed
868     {
869         match self.iter.next() {
870             Some((key, value)) => {
871                 self.value = Some(value);
872                 seed.deserialize(ContentDeserializer::new(key)).map(Some)
873             }
874             None => Ok(None),
875         }
876     }
877 
visit_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error> where T: de::DeserializeSeed878     fn visit_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>
879         where T: de::DeserializeSeed
880     {
881         match self.value.take() {
882             Some(value) => seed.deserialize(ContentDeserializer::new(value)),
883             None => Err(de::Error::custom("value is missing")),
884         }
885     }
886 
size_hint(&self) -> (usize, Option<usize>)887     fn size_hint(&self) -> (usize, Option<usize>) {
888         self.iter.size_hint()
889     }
890 }
891 
892 impl<E> de::Deserializer for MapDeserializer<E>
893     where E: de::Error
894 {
895     type Error = E;
896 
897     #[inline]
deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor898     fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error>
899         where V: de::Visitor
900     {
901         visitor.visit_map(self)
902     }
903 
904     forward_to_deserialize! {
905         bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option
906         seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct
907         tuple_struct struct struct_field tuple enum ignored_any
908     }
909 }
910 
911 
912 /// Not public API.
913 pub struct ContentRefDeserializer<'a, E> {
914     content: &'a Content,
915     err: PhantomData<E>,
916 }
917 
918 /// Used when deserializing an untagged enum because the content may need to be
919 /// used more than once.
920 impl<'a, E> Deserializer for ContentRefDeserializer<'a, E>
921     where E: de::Error
922 {
923     type Error = E;
924 
deserialize<V>(self, visitor: V) -> Result<V::Value, E> where V: Visitor925     fn deserialize<V>(self, visitor: V) -> Result<V::Value, E>
926         where V: Visitor
927     {
928         match *self.content {
929             Content::Bool(v) => visitor.visit_bool(v),
930             Content::U8(v) => visitor.visit_u8(v),
931             Content::U16(v) => visitor.visit_u16(v),
932             Content::U32(v) => visitor.visit_u32(v),
933             Content::U64(v) => visitor.visit_u64(v),
934             Content::I8(v) => visitor.visit_i8(v),
935             Content::I16(v) => visitor.visit_i16(v),
936             Content::I32(v) => visitor.visit_i32(v),
937             Content::I64(v) => visitor.visit_i64(v),
938             Content::F32(v) => visitor.visit_f32(v),
939             Content::F64(v) => visitor.visit_f64(v),
940             Content::Char(v) => visitor.visit_char(v),
941             Content::String(ref v) => visitor.visit_str(v),
942             Content::Unit => visitor.visit_unit(),
943             Content::None => visitor.visit_none(),
944             Content::Some(ref v) => visitor.visit_some(ContentRefDeserializer::new(v)),
945             Content::Newtype(ref v) => visitor.visit_newtype_struct(ContentRefDeserializer::new(v)),
946             Content::Seq(ref v) => {
947                 let seq = v.into_iter().map(ContentRefDeserializer::new);
948                 let mut seq_visitor = de::value::SeqDeserializer::new(seq);
949                 let value = try!(visitor.visit_seq(&mut seq_visitor));
950                 try!(seq_visitor.end());
951                 Ok(value)
952             }
953             Content::Map(ref v) => {
954                 let map = v.into_iter().map(|&(ref k, ref v)| {
955                                                 (ContentRefDeserializer::new(k),
956                                                  ContentRefDeserializer::new(v))
957                                             });
958                 let mut map_visitor = de::value::MapDeserializer::new(map);
959                 let value = try!(visitor.visit_map(&mut map_visitor));
960                 try!(map_visitor.end());
961                 Ok(value)
962             }
963             Content::Bytes(ref v) => visitor.visit_bytes(v),
964         }
965     }
966 
deserialize_option<V>(self, visitor: V) -> Result<V::Value, E> where V: Visitor967     fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, E>
968         where V: Visitor
969     {
970         match *self.content {
971             Content::None => visitor.visit_none(),
972             Content::Some(ref v) => visitor.visit_some(ContentRefDeserializer::new(v)),
973             Content::Unit => visitor.visit_unit(),
974             _ => visitor.visit_some(self),
975         }
976     }
977 
deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, E> where V: Visitor978     fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value, E>
979         where V: Visitor
980     {
981         visitor.visit_newtype_struct(self)
982     }
983 
deserialize_enum<V>(self, _name: &str, _variants: &'static [&'static str], visitor: V) -> Result<V::Value, Self::Error> where V: Visitor984     fn deserialize_enum<V>(self,
985                            _name: &str,
986                            _variants: &'static [&'static str],
987                            visitor: V)
988                            -> Result<V::Value, Self::Error>
989         where V: Visitor
990     {
991         let (variant, value) = match *self.content {
992             Content::Map(ref value) => {
993                 let mut iter = value.into_iter();
994                 let &(ref variant, ref value) = match iter.next() {
995                     Some(v) => v,
996                     None => {
997                         return Err(de::Error::invalid_value(de::Unexpected::Map,
998                                                             &"map with a single key"));
999                     }
1000                 };
1001                 // enums are encoded in json as maps with a single key:value pair
1002                 if iter.next().is_some() {
1003                     return Err(de::Error::invalid_value(de::Unexpected::Map,
1004                                                         &"map with a single key"));
1005                 }
1006                 (variant, Some(value))
1007             }
1008             ref s @ Content::String(_) => (s, None),
1009             ref other => {
1010                 return Err(de::Error::invalid_type(other.unexpected(), &"string or map"));
1011             }
1012         };
1013 
1014         visitor.visit_enum(EnumRefDeserializer {
1015                                variant: variant,
1016                                value: value,
1017                                err: PhantomData,
1018                            })
1019     }
1020 
1021     forward_to_deserialize! {
1022         bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq
1023         seq_fixed_size bytes byte_buf map unit_struct tuple_struct struct
1024         struct_field tuple ignored_any
1025     }
1026 }
1027 
1028 impl<'a, E> ContentRefDeserializer<'a, E> {
1029     /// private API, don't use
new(content: &'a Content) -> Self1030     pub fn new(content: &'a Content) -> Self {
1031         ContentRefDeserializer {
1032             content: content,
1033             err: PhantomData,
1034         }
1035     }
1036 }
1037 
1038 struct EnumRefDeserializer<'a, E>
1039     where E: de::Error
1040 {
1041     variant: &'a Content,
1042     value: Option<&'a Content>,
1043     err: PhantomData<E>,
1044 }
1045 
1046 impl<'a, E> de::EnumVisitor for EnumRefDeserializer<'a, E>
1047     where E: de::Error
1048 {
1049     type Error = E;
1050     type Variant = VariantRefDeserializer<'a, Self::Error>;
1051 
visit_variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error> where V: de::DeserializeSeed1052     fn visit_variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
1053         where V: de::DeserializeSeed
1054     {
1055         let visitor = VariantRefDeserializer {
1056             value: self.value,
1057             err: PhantomData,
1058         };
1059         seed.deserialize(ContentRefDeserializer::new(self.variant)).map(|v| (v, visitor))
1060     }
1061 }
1062 
1063 struct VariantRefDeserializer<'a, E>
1064     where E: de::Error
1065 {
1066     value: Option<&'a Content>,
1067     err: PhantomData<E>,
1068 }
1069 
1070 impl<'a, E> de::VariantVisitor for VariantRefDeserializer<'a, E>
1071     where E: de::Error
1072 {
1073     type Error = E;
1074 
visit_unit(self) -> Result<(), E>1075     fn visit_unit(self) -> Result<(), E> {
1076         match self.value {
1077             Some(value) => de::Deserialize::deserialize(ContentRefDeserializer::new(value)),
1078             None => Ok(()),
1079         }
1080     }
1081 
visit_newtype_seed<T>(self, seed: T) -> Result<T::Value, E> where T: de::DeserializeSeed1082     fn visit_newtype_seed<T>(self, seed: T) -> Result<T::Value, E>
1083         where T: de::DeserializeSeed
1084     {
1085         match self.value {
1086             Some(value) => seed.deserialize(ContentRefDeserializer::new(value)),
1087             None => Err(de::Error::invalid_type(de::Unexpected::UnitVariant, &"newtype variant")),
1088         }
1089     }
1090 
visit_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor1091     fn visit_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
1092         where V: de::Visitor
1093     {
1094         match self.value {
1095             Some(&Content::Seq(ref v)) => {
1096                 de::Deserializer::deserialize(SeqRefDeserializer::new(v), visitor)
1097             }
1098             Some(other) => Err(de::Error::invalid_type(other.unexpected(), &"tuple variant")),
1099             None => Err(de::Error::invalid_type(de::Unexpected::UnitVariant, &"tuple variant")),
1100         }
1101     }
1102 
visit_struct<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor1103     fn visit_struct<V>(self,
1104                        _fields: &'static [&'static str],
1105                        visitor: V)
1106                        -> Result<V::Value, Self::Error>
1107         where V: de::Visitor
1108     {
1109         match self.value {
1110             Some(&Content::Map(ref v)) => {
1111                 de::Deserializer::deserialize(MapRefDeserializer::new(v), visitor)
1112             }
1113             Some(other) => Err(de::Error::invalid_type(other.unexpected(), &"struct variant")),
1114             _ => Err(de::Error::invalid_type(de::Unexpected::UnitVariant, &"struct variant")),
1115         }
1116     }
1117 }
1118 
1119 struct SeqRefDeserializer<'a, E>
1120     where E: de::Error
1121 {
1122     iter: <&'a [Content] as IntoIterator>::IntoIter,
1123     err: PhantomData<E>,
1124 }
1125 
1126 impl<'a, E> SeqRefDeserializer<'a, E>
1127     where E: de::Error
1128 {
new(vec: &'a [Content]) -> Self1129     fn new(vec: &'a [Content]) -> Self {
1130         SeqRefDeserializer {
1131             iter: vec.into_iter(),
1132             err: PhantomData,
1133         }
1134     }
1135 }
1136 
1137 impl<'a, E> de::Deserializer for SeqRefDeserializer<'a, E>
1138     where E: de::Error
1139 {
1140     type Error = E;
1141 
1142     #[inline]
deserialize<V>(mut self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor1143     fn deserialize<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
1144         where V: de::Visitor
1145     {
1146         let len = self.iter.len();
1147         if len == 0 {
1148             visitor.visit_unit()
1149         } else {
1150             let ret = try!(visitor.visit_seq(&mut self));
1151             let remaining = self.iter.len();
1152             if remaining == 0 {
1153                 Ok(ret)
1154             } else {
1155                 Err(de::Error::invalid_length(len, &"fewer elements in array"))
1156             }
1157         }
1158     }
1159 
1160     forward_to_deserialize! {
1161         bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option
1162         seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct
1163         tuple_struct struct struct_field tuple enum ignored_any
1164     }
1165 }
1166 
1167 impl<'a, E> de::SeqVisitor for SeqRefDeserializer<'a, E>
1168     where E: de::Error
1169 {
1170     type Error = E;
1171 
visit_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> where T: de::DeserializeSeed1172     fn visit_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
1173         where T: de::DeserializeSeed
1174     {
1175         match self.iter.next() {
1176             Some(value) => seed.deserialize(ContentRefDeserializer::new(value)).map(Some),
1177             None => Ok(None),
1178         }
1179     }
1180 
size_hint(&self) -> (usize, Option<usize>)1181     fn size_hint(&self) -> (usize, Option<usize>) {
1182         self.iter.size_hint()
1183     }
1184 }
1185 
1186 struct MapRefDeserializer<'a, E>
1187     where E: de::Error
1188 {
1189     iter: <&'a [(Content, Content)] as IntoIterator>::IntoIter,
1190     value: Option<&'a Content>,
1191     err: PhantomData<E>,
1192 }
1193 
1194 impl<'a, E> MapRefDeserializer<'a, E>
1195     where E: de::Error
1196 {
new(map: &'a [(Content, Content)]) -> Self1197     fn new(map: &'a [(Content, Content)]) -> Self {
1198         MapRefDeserializer {
1199             iter: map.into_iter(),
1200             value: None,
1201             err: PhantomData,
1202         }
1203     }
1204 }
1205 
1206 impl<'a, E> de::MapVisitor for MapRefDeserializer<'a, E>
1207     where E: de::Error
1208 {
1209     type Error = E;
1210 
visit_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> where T: de::DeserializeSeed1211     fn visit_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
1212         where T: de::DeserializeSeed
1213     {
1214         match self.iter.next() {
1215             Some(&(ref key, ref value)) => {
1216                 self.value = Some(value);
1217                 seed.deserialize(ContentRefDeserializer::new(key)).map(Some)
1218             }
1219             None => Ok(None),
1220         }
1221     }
1222 
visit_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error> where T: de::DeserializeSeed1223     fn visit_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>
1224         where T: de::DeserializeSeed
1225     {
1226         match self.value.take() {
1227             Some(value) => seed.deserialize(ContentRefDeserializer::new(value)),
1228             None => Err(de::Error::custom("value is missing")),
1229         }
1230     }
1231 
size_hint(&self) -> (usize, Option<usize>)1232     fn size_hint(&self) -> (usize, Option<usize>) {
1233         self.iter.size_hint()
1234     }
1235 }
1236 
1237 impl<'a, E> de::Deserializer for MapRefDeserializer<'a, E>
1238     where E: de::Error
1239 {
1240     type Error = E;
1241 
1242     #[inline]
deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor1243     fn deserialize<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1244         where V: de::Visitor
1245     {
1246         visitor.visit_map(self)
1247     }
1248 
1249     forward_to_deserialize! {
1250         bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option
1251         seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct
1252         tuple_struct struct struct_field tuple enum ignored_any
1253     }
1254 }
1255 
1256 impl<E> de::value::ValueDeserializer<E> for ContentDeserializer<E>
1257     where E: de::Error
1258 {
1259     type Deserializer = Self;
1260 
into_deserializer(self) -> Self1261     fn into_deserializer(self) -> Self {
1262         self
1263     }
1264 }
1265 
1266 impl<'a, E> de::value::ValueDeserializer<E> for ContentRefDeserializer<'a, E>
1267     where E: de::Error
1268 {
1269     type Deserializer = Self;
1270 
into_deserializer(self) -> Self1271     fn into_deserializer(self) -> Self {
1272         self
1273     }
1274 }
1275 
1276 /// Visitor for deserializing an internally tagged unit variant.
1277 ///
1278 /// Not public API.
1279 pub struct InternallyTaggedUnitVisitor<'a> {
1280     type_name: &'a str,
1281     variant_name: &'a str,
1282 }
1283 
1284 impl<'a> InternallyTaggedUnitVisitor<'a> {
1285     /// Not public API.
new(type_name: &'a str, variant_name: &'a str) -> Self1286     pub fn new(type_name: &'a str, variant_name: &'a str) -> Self {
1287         InternallyTaggedUnitVisitor {
1288             type_name: type_name,
1289             variant_name: variant_name,
1290         }
1291     }
1292 }
1293 
1294 impl<'a> Visitor for InternallyTaggedUnitVisitor<'a> {
1295     type Value = ();
1296 
expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result1297     fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1298         write!(formatter, "unit variant {}::{}", self.type_name, self.variant_name)
1299     }
1300 
visit_map<V>(self, _: V) -> Result<(), V::Error> where V: MapVisitor1301     fn visit_map<V>(self, _: V) -> Result<(), V::Error>
1302         where V: MapVisitor
1303     {
1304         Ok(())
1305     }
1306 }
1307 
1308 /// Visitor for deserializing an untagged unit variant.
1309 ///
1310 /// Not public API.
1311 pub struct UntaggedUnitVisitor<'a> {
1312     type_name: &'a str,
1313     variant_name: &'a str,
1314 }
1315 
1316 impl<'a> UntaggedUnitVisitor<'a> {
1317     /// Not public API.
new(type_name: &'a str, variant_name: &'a str) -> Self1318     pub fn new(type_name: &'a str, variant_name: &'a str) -> Self {
1319         UntaggedUnitVisitor {
1320             type_name: type_name,
1321             variant_name: variant_name,
1322         }
1323     }
1324 }
1325 
1326 impl<'a> Visitor for UntaggedUnitVisitor<'a> {
1327     type Value = ();
1328 
expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result1329     fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1330         write!(formatter, "unit variant {}::{}", self.type_name, self.variant_name)
1331     }
1332 
visit_unit<E>(self) -> Result<(), E> where E: de::Error1333     fn visit_unit<E>(self) -> Result<(), E>
1334         where E: de::Error
1335     {
1336         Ok(())
1337     }
1338 }
1339