serde_tagged/util/de/
content.rs

1// This file is adapted from `serde`, specifically the modules `content` and
2// `size_hint` in
3// https://github.com/serde-rs/serde/blob/v1.0.29/serde/src/private/de.rs
4//
5// The original copyright notice:
6// > Copyright 2017 Serde Developers
7// >
8// > Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
9// > http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
10// > <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
11// > option. This file may not be copied, modified, or distributed
12// > except according to those terms.
13//
14// The mentioned license files for the original can be found at
15// https://github.com/serde-rs/serde/blob/v1.0.27/LICENSE-APACHE
16// https://github.com/serde-rs/serde/blob/v1.0.27/LICENSE-MIT
17//
18// The original MIT license file:
19// > Copyright (c) 2014 The Rust Project Developers
20// >
21// > Permission is hereby granted, free of charge, to any
22// > person obtaining a copy of this software and associated
23// > documentation files (the "Software"), to deal in the
24// > Software without restriction, including without
25// > limitation the rights to use, copy, modify, merge,
26// > publish, distribute, sublicense, and/or sell copies of
27// > the Software, and to permit persons to whom the Software
28// > is furnished to do so, subject to the following
29// > conditions:
30// >
31// > The above copyright notice and this permission notice
32// > shall be included in all copies or substantial portions
33// > of the Software.
34// >
35// > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
36// > ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
37// > TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
38// > PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
39// > SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
40// > CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
41// > OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
42// > IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
43// > DEALINGS IN THE SOFTWARE.
44//
45// Changes made to the original module:
46// - re-formatted code using rustfmt (appearance, replaced try! with ?)
47// - changed import, absolute and relative paths for compatibility
48// - removed some comments
49// - removed types and respecitve impls for:
50//   - `TagOrContent`
51//   - `TagOrContentVisitor`
52//   - `TaggedContent`
53//   - `TaggedContentField`
54//   - `TaggedContentFieldVisitor`
55//   - `TaggedContentOtherField`
56//   - `TaggedContentOtherFieldVisitor`
57//   - `InternallyTaggedUnitVisitor`
58//   - `UntaggedUnitVisitor`
59//   - `IdentifierDeserializer`
60//   - `StrDeserializer`
61//   - `BytesDeserializer`
62//   - `InPlaceSeed`
63// - removed unused imports
64// - fixed clippy warnings
65// - add special case for empty `Content::Seq` to `ContentDeserializer::deserialize_unit_struct`
66// - changed visibility of `ContentVisitor` and its `new` function to public
67//
68
69
70pub 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                // enums are encoded in json as maps with a single key:value pair
476                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            // As a special case, allow deserializing untagged newtype
510            // variant containing unit struct.
511            //
512            //     #[derive(Deserialize)]
513            //     struct Info;
514            //
515            //     #[derive(Deserialize)]
516            //     #[serde(tag = "topic")]
517            //     enum Message {
518            //         Info(Info),
519            //     }
520            //
521            // We want {"topic":"Info"} to deserialize even though
522            // ordinarily unit structs do not deserialize from empty map.
523            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    /// private API, don't use
538    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                // enums are encoded in json as maps with a single key:value pair
904                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}