ron/de/
mod.rs

1/// Deserialization module.
2use std::{
3    io::{self, Write},
4    str,
5};
6
7use serde::{
8    de::{self, DeserializeSeed, Deserializer as _, Visitor},
9    Deserialize,
10};
11
12pub use crate::error::{Error, Position, SpannedError};
13use crate::{
14    error::{Result, SpannedResult},
15    extensions::Extensions,
16    options::Options,
17    parse::{NewtypeMode, ParsedByteStr, ParsedStr, Parser, StructType, TupleMode},
18};
19
20mod id;
21mod tag;
22#[cfg(test)]
23mod tests;
24mod value;
25
26const SERDE_CONTENT_CANARY: &str = "serde::__private::de::content::Content";
27const SERDE_TAG_KEY_CANARY: &str = "serde::__private::de::content::TagOrContent";
28
29/// The RON deserializer.
30///
31/// If you just want to simply deserialize a value,
32/// you can use the [`from_str`] convenience function.
33pub struct Deserializer<'de> {
34    pub(crate) parser: Parser<'de>,
35    newtype_variant: bool,
36    serde_content_newtype: bool,
37    last_identifier: Option<&'de str>,
38    recursion_limit: Option<usize>,
39}
40
41impl<'de> Deserializer<'de> {
42    // Cannot implement trait here since output is tied to input lifetime 'de.
43    #[allow(clippy::should_implement_trait)]
44    pub fn from_str(input: &'de str) -> SpannedResult<Self> {
45        Self::from_str_with_options(input, &Options::default())
46    }
47
48    pub fn from_bytes(input: &'de [u8]) -> SpannedResult<Self> {
49        Self::from_bytes_with_options(input, &Options::default())
50    }
51
52    pub fn from_str_with_options(input: &'de str, options: &Options) -> SpannedResult<Self> {
53        let mut deserializer = Deserializer {
54            parser: Parser::new(input)?,
55            newtype_variant: false,
56            serde_content_newtype: false,
57            last_identifier: None,
58            recursion_limit: options.recursion_limit,
59        };
60
61        deserializer.parser.exts |= options.default_extensions;
62
63        Ok(deserializer)
64    }
65
66    // FIXME: panic is not actually possible, remove once utf8_chunks is stabilized
67    #[allow(clippy::missing_panics_doc)]
68    pub fn from_bytes_with_options(input: &'de [u8], options: &Options) -> SpannedResult<Self> {
69        let err = match str::from_utf8(input) {
70            Ok(input) => return Self::from_str_with_options(input, options),
71            Err(err) => err,
72        };
73
74        // FIXME: use [`utf8_chunks`](https://github.com/rust-lang/rust/issues/99543) once stabilised
75        #[allow(clippy::expect_used)]
76        let valid_input =
77            str::from_utf8(&input[..err.valid_up_to()]).expect("source is valid up to error");
78
79        Err(SpannedError {
80            code: err.into(),
81            position: Position::from_src_end(valid_input),
82        })
83    }
84
85    #[must_use]
86    pub fn remainder(&self) -> &'de str {
87        self.parser.src()
88    }
89
90    #[must_use]
91    pub fn span_error(&self, code: Error) -> SpannedError {
92        self.parser.span_error(code)
93    }
94
95    #[must_use]
96    pub fn extensions(&self) -> Extensions {
97        self.parser.exts
98    }
99}
100
101/// A convenience function for building a deserializer
102/// and deserializing a value of type `T` from a reader.
103pub fn from_reader<R, T>(rdr: R) -> SpannedResult<T>
104where
105    R: io::Read,
106    T: de::DeserializeOwned,
107{
108    Options::default().from_reader(rdr)
109}
110
111/// A convenience function for building a deserializer
112/// and deserializing a value of type `T` from a string.
113pub fn from_str<'a, T>(s: &'a str) -> SpannedResult<T>
114where
115    T: de::Deserialize<'a>,
116{
117    Options::default().from_str(s)
118}
119
120/// A convenience function for building a deserializer
121/// and deserializing a value of type `T` from bytes.
122pub fn from_bytes<'a, T>(s: &'a [u8]) -> SpannedResult<T>
123where
124    T: de::Deserialize<'a>,
125{
126    Options::default().from_bytes(s)
127}
128
129macro_rules! guard_recursion {
130    ($self:expr => $expr:expr) => {{
131        if let Some(limit) = &mut $self.recursion_limit {
132            if let Some(new_limit) = limit.checked_sub(1) {
133                *limit = new_limit;
134            } else {
135                return Err(Error::ExceededRecursionLimit);
136            }
137        }
138
139        let result = $expr;
140
141        if let Some(limit) = &mut $self.recursion_limit {
142            *limit = limit.saturating_add(1);
143        }
144
145        result
146    }};
147}
148
149impl<'de> Deserializer<'de> {
150    /// Check if the remaining bytes are whitespace only,
151    /// otherwise return an error.
152    pub fn end(&mut self) -> Result<()> {
153        self.parser.skip_ws()?;
154
155        if self.parser.src().is_empty() {
156            Ok(())
157        } else {
158            Err(Error::TrailingCharacters)
159        }
160    }
161
162    /// Called from [`deserialize_any`][serde::Deserializer::deserialize_any]
163    /// when a struct was detected. Decides if there is a unit, tuple or usual
164    /// struct and deserializes it accordingly.
165    ///
166    /// This method assumes there is no identifier left.
167    fn handle_any_struct<V>(&mut self, visitor: V, ident: Option<&str>) -> Result<V::Value>
168    where
169        V: Visitor<'de>,
170    {
171        // HACK: switch to JSON enum semantics for JSON content
172        // Robust impl blocked on https://github.com/serde-rs/serde/pull/2420
173        let is_serde_content = std::any::type_name::<V::Value>() == SERDE_CONTENT_CANARY
174            || std::any::type_name::<V::Value>() == SERDE_TAG_KEY_CANARY;
175
176        let old_serde_content_newtype = self.serde_content_newtype;
177        self.serde_content_newtype = false;
178
179        match (
180            self.parser.check_struct_type(
181                NewtypeMode::NoParensMeanUnit,
182                if old_serde_content_newtype {
183                    TupleMode::DifferentiateNewtype // separate match on NewtypeOrTuple below
184                } else {
185                    TupleMode::ImpreciseTupleOrNewtype // Tuple and NewtypeOrTuple match equally
186                },
187            )?,
188            ident,
189        ) {
190            (StructType::Unit, Some(ident)) if is_serde_content => {
191                // serde's Content type needs the ident for unit variants
192                visitor.visit_str(ident)
193            }
194            (StructType::Unit, _) => visitor.visit_unit(),
195            (_, Some(ident)) if is_serde_content => {
196                // serde's Content type uses a singleton map encoding for enums
197                visitor.visit_map(SerdeEnumContent {
198                    de: self,
199                    ident: Some(ident),
200                })
201            }
202            (StructType::Named, _) => {
203                // giving no name results in worse errors but is necessary here
204                self.handle_struct_after_name("", visitor)
205            }
206            (StructType::NewtypeTuple, _) if old_serde_content_newtype => {
207                // deserialize a newtype struct or variant
208                self.parser.consume_char('(');
209                self.parser.skip_ws()?;
210                let result = self.deserialize_any(visitor);
211                self.parser.skip_ws()?;
212                self.parser.consume_char(')');
213
214                result
215            }
216            (
217                StructType::AnyTuple
218                | StructType::EmptyTuple
219                | StructType::NewtypeTuple
220                | StructType::NonNewtypeTuple,
221                _,
222            ) => {
223                // first argument is technically incorrect, but ignored anyway
224                self.deserialize_tuple(0, visitor)
225            }
226        }
227    }
228
229    /// Called from
230    /// [`deserialize_struct`][serde::Deserializer::deserialize_struct],
231    /// [`struct_variant`][serde::de::VariantAccess::struct_variant], and
232    /// [`handle_any_struct`][Self::handle_any_struct]. Handles
233    /// deserialising the enclosing parentheses and everything in between.
234    ///
235    /// This method assumes there is no struct name identifier left.
236    fn handle_struct_after_name<V>(
237        &mut self,
238        name_for_pretty_errors_only: &'static str,
239        visitor: V,
240    ) -> Result<V::Value>
241    where
242        V: Visitor<'de>,
243    {
244        if self.newtype_variant || self.parser.consume_char('(') {
245            let old_newtype_variant = self.newtype_variant;
246            self.newtype_variant = false;
247
248            let value = guard_recursion! { self =>
249                visitor
250                    .visit_map(CommaSeparated::new(Terminator::Struct, self))
251                    .map_err(|err| {
252                        struct_error_name(
253                            err,
254                            if !old_newtype_variant && !name_for_pretty_errors_only.is_empty() {
255                                Some(name_for_pretty_errors_only)
256                            } else {
257                                None
258                            },
259                        )
260                    })?
261            };
262
263            self.parser.skip_ws()?;
264
265            if old_newtype_variant || self.parser.consume_char(')') {
266                Ok(value)
267            } else {
268                Err(Error::ExpectedStructLikeEnd)
269            }
270        } else if name_for_pretty_errors_only.is_empty() {
271            Err(Error::ExpectedStructLike)
272        } else {
273            Err(Error::ExpectedNamedStructLike(name_for_pretty_errors_only))
274        }
275    }
276}
277
278impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
279    type Error = Error;
280
281    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
282    where
283        V: Visitor<'de>,
284    {
285        if self.newtype_variant {
286            if self.parser.check_char(')') {
287                // newtype variant wraps the unit type / a unit struct without name
288                return self.deserialize_unit(visitor);
289            }
290
291            #[allow(clippy::wildcard_in_or_patterns)]
292            match self
293                .parser
294                .check_struct_type(NewtypeMode::InsideNewtype, TupleMode::DifferentiateNewtype)?
295            {
296                StructType::Named => {
297                    // newtype variant wraps a named struct
298                    // giving no name results in worse errors but is necessary here
299                    return self.handle_struct_after_name("", visitor);
300                }
301                StructType::EmptyTuple | StructType::NonNewtypeTuple => {
302                    // newtype variant wraps a tuple (struct)
303                    // first argument is technically incorrect, but ignored anyway
304                    return self.deserialize_tuple(0, visitor);
305                }
306                // StructType::Unit is impossible with NewtypeMode::InsideNewtype
307                // StructType::AnyTuple is impossible with TupleMode::DifferentiateNewtype
308                StructType::NewtypeTuple | _ => {
309                    // continue as usual with the inner content of the newtype variant
310                    self.newtype_variant = false;
311                }
312            }
313        }
314
315        if self.parser.consume_ident("true") {
316            return visitor.visit_bool(true);
317        } else if self.parser.consume_ident("false") {
318            return visitor.visit_bool(false);
319        } else if self.parser.check_ident("Some") {
320            return self.deserialize_option(visitor);
321        } else if self.parser.consume_ident("None") {
322            return visitor.visit_none();
323        } else if self.parser.consume_str("()") {
324            return visitor.visit_unit();
325        } else if self.parser.consume_ident("inf") || self.parser.consume_ident("inff32") {
326            return visitor.visit_f32(std::f32::INFINITY);
327        } else if self.parser.consume_ident("inff64") {
328            return visitor.visit_f64(std::f64::INFINITY);
329        } else if self.parser.consume_ident("NaN") || self.parser.consume_ident("NaNf32") {
330            return visitor.visit_f32(std::f32::NAN);
331        } else if self.parser.consume_ident("NaNf64") {
332            return visitor.visit_f64(std::f64::NAN);
333        }
334
335        // `skip_identifier` does not change state if it fails
336        if let Some(ident) = self.parser.skip_identifier() {
337            self.parser.skip_ws()?;
338
339            return self.handle_any_struct(visitor, Some(ident));
340        }
341
342        match self.parser.peek_char_or_eof()? {
343            '(' => self.handle_any_struct(visitor, None),
344            '[' => self.deserialize_seq(visitor),
345            '{' => self.deserialize_map(visitor),
346            '0'..='9' | '+' | '-' | '.' => self.parser.any_number()?.visit(visitor),
347            '"' | 'r' => self.deserialize_string(visitor),
348            'b' if self.parser.src().starts_with("b'") => self.parser.any_number()?.visit(visitor),
349            'b' => self.deserialize_byte_buf(visitor),
350            '\'' => self.deserialize_char(visitor),
351            other => Err(Error::UnexpectedChar(other)),
352        }
353    }
354
355    fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
356    where
357        V: Visitor<'de>,
358    {
359        visitor.visit_bool(self.parser.bool()?)
360    }
361
362    fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value>
363    where
364        V: Visitor<'de>,
365    {
366        visitor.visit_i8(self.parser.integer()?)
367    }
368
369    fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value>
370    where
371        V: Visitor<'de>,
372    {
373        visitor.visit_i16(self.parser.integer()?)
374    }
375
376    fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value>
377    where
378        V: Visitor<'de>,
379    {
380        visitor.visit_i32(self.parser.integer()?)
381    }
382
383    fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value>
384    where
385        V: Visitor<'de>,
386    {
387        visitor.visit_i64(self.parser.integer()?)
388    }
389
390    #[cfg(feature = "integer128")]
391    fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value>
392    where
393        V: Visitor<'de>,
394    {
395        visitor.visit_i128(self.parser.integer()?)
396    }
397
398    fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value>
399    where
400        V: Visitor<'de>,
401    {
402        visitor.visit_u8(self.parser.integer()?)
403    }
404
405    fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value>
406    where
407        V: Visitor<'de>,
408    {
409        visitor.visit_u16(self.parser.integer()?)
410    }
411
412    fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value>
413    where
414        V: Visitor<'de>,
415    {
416        visitor.visit_u32(self.parser.integer()?)
417    }
418
419    fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value>
420    where
421        V: Visitor<'de>,
422    {
423        visitor.visit_u64(self.parser.integer()?)
424    }
425
426    #[cfg(feature = "integer128")]
427    fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value>
428    where
429        V: Visitor<'de>,
430    {
431        visitor.visit_u128(self.parser.integer()?)
432    }
433
434    fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value>
435    where
436        V: Visitor<'de>,
437    {
438        visitor.visit_f32(self.parser.float()?)
439    }
440
441    fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value>
442    where
443        V: Visitor<'de>,
444    {
445        visitor.visit_f64(self.parser.float()?)
446    }
447
448    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
449    where
450        V: Visitor<'de>,
451    {
452        visitor.visit_char(self.parser.char()?)
453    }
454
455    fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
456    where
457        V: Visitor<'de>,
458    {
459        match self.parser.string()? {
460            ParsedStr::Allocated(s) => visitor.visit_string(s),
461            ParsedStr::Slice(s) => visitor.visit_borrowed_str(s),
462        }
463    }
464
465    fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
466    where
467        V: Visitor<'de>,
468    {
469        self.deserialize_str(visitor)
470    }
471
472    fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
473    where
474        V: Visitor<'de>,
475    {
476        self.deserialize_byte_buf(visitor)
477    }
478
479    fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
480    where
481        V: Visitor<'de>,
482    {
483        if self.parser.check_char('[') {
484            let bytes = Vec::<u8>::deserialize(self)?;
485            return visitor.visit_byte_buf(bytes);
486        }
487
488        match self.parser.byte_string()? {
489            ParsedByteStr::Allocated(byte_buf) => visitor.visit_byte_buf(byte_buf),
490            ParsedByteStr::Slice(bytes) => visitor.visit_borrowed_bytes(bytes),
491        }
492    }
493
494    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
495    where
496        V: Visitor<'de>,
497    {
498        if self.parser.consume_ident("None") {
499            visitor.visit_none()
500        } else if self.parser.consume_ident("Some") && {
501            self.parser.skip_ws()?;
502            self.parser.consume_char('(')
503        } {
504            self.parser.skip_ws()?;
505
506            self.newtype_variant = self
507                .parser
508                .exts
509                .contains(Extensions::UNWRAP_VARIANT_NEWTYPES);
510
511            let v = guard_recursion! { self => visitor.visit_some(&mut *self)? };
512
513            self.newtype_variant = false;
514
515            self.parser.comma()?;
516
517            if self.parser.consume_char(')') {
518                Ok(v)
519            } else {
520                Err(Error::ExpectedOptionEnd)
521            }
522        } else if self.parser.exts.contains(Extensions::IMPLICIT_SOME) {
523            guard_recursion! { self => visitor.visit_some(&mut *self) }
524        } else {
525            Err(Error::ExpectedOption)
526        }
527    }
528
529    // In Serde, unit means an anonymous value containing no data.
530    fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
531    where
532        V: Visitor<'de>,
533    {
534        if self.newtype_variant || self.parser.consume_str("()") {
535            self.newtype_variant = false;
536
537            visitor.visit_unit()
538        } else {
539            Err(Error::ExpectedUnit)
540        }
541    }
542
543    fn deserialize_unit_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
544    where
545        V: Visitor<'de>,
546    {
547        if self.newtype_variant || self.parser.consume_struct_name(name)? {
548            self.newtype_variant = false;
549
550            visitor.visit_unit()
551        } else {
552            self.deserialize_unit(visitor)
553        }
554    }
555
556    fn deserialize_newtype_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
557    where
558        V: Visitor<'de>,
559    {
560        if name == crate::value::raw::RAW_VALUE_TOKEN {
561            let src_before = self.parser.pre_ws_src();
562            self.parser.skip_ws()?;
563            let _ignored = self.deserialize_ignored_any(serde::de::IgnoredAny)?;
564            self.parser.skip_ws()?;
565            let src_after = self.parser.src();
566
567            if self.parser.has_unclosed_line_comment() {
568                return Err(Error::UnclosedLineComment);
569            }
570
571            let ron_str = &src_before[..src_before.len() - src_after.len()];
572
573            return visitor
574                .visit_borrowed_str::<Error>(ron_str)
575                .map_err(|_| Error::ExpectedRawValue);
576        }
577
578        if self.parser.exts.contains(Extensions::UNWRAP_NEWTYPES) || self.newtype_variant {
579            self.newtype_variant = false;
580
581            return guard_recursion! { self => visitor.visit_newtype_struct(&mut *self) };
582        }
583
584        self.parser.consume_struct_name(name)?;
585
586        self.parser.skip_ws()?;
587
588        if self.parser.consume_char('(') {
589            self.parser.skip_ws()?;
590            let value = guard_recursion! { self => visitor.visit_newtype_struct(&mut *self)? };
591            self.parser.comma()?;
592
593            if self.parser.consume_char(')') {
594                Ok(value)
595            } else {
596                Err(Error::ExpectedStructLikeEnd)
597            }
598        } else if name.is_empty() {
599            Err(Error::ExpectedStructLike)
600        } else {
601            Err(Error::ExpectedNamedStructLike(name))
602        }
603    }
604
605    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
606    where
607        V: Visitor<'de>,
608    {
609        self.newtype_variant = false;
610
611        if self.parser.consume_char('[') {
612            let value = guard_recursion! { self =>
613                visitor.visit_seq(CommaSeparated::new(Terminator::Seq, self))?
614            };
615            self.parser.skip_ws()?;
616
617            if self.parser.consume_char(']') {
618                Ok(value)
619            } else {
620                Err(Error::ExpectedArrayEnd)
621            }
622        } else {
623            Err(Error::ExpectedArray)
624        }
625    }
626
627    fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
628    where
629        V: Visitor<'de>,
630    {
631        if self.newtype_variant || self.parser.consume_char('(') {
632            let old_newtype_variant = self.newtype_variant;
633            self.newtype_variant = false;
634
635            let value = guard_recursion! { self =>
636                visitor.visit_seq(CommaSeparated::new(Terminator::Tuple, self))?
637            };
638            self.parser.skip_ws()?;
639
640            if old_newtype_variant || self.parser.consume_char(')') {
641                Ok(value)
642            } else {
643                Err(Error::ExpectedStructLikeEnd)
644            }
645        } else {
646            Err(Error::ExpectedStructLike)
647        }
648    }
649
650    fn deserialize_tuple_struct<V>(
651        self,
652        name: &'static str,
653        len: usize,
654        visitor: V,
655    ) -> Result<V::Value>
656    where
657        V: Visitor<'de>,
658    {
659        if !self.newtype_variant {
660            self.parser.consume_struct_name(name)?;
661        }
662
663        self.deserialize_tuple(len, visitor).map_err(|e| match e {
664            Error::ExpectedStructLike if !name.is_empty() => Error::ExpectedNamedStructLike(name),
665            e => e,
666        })
667    }
668
669    fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
670    where
671        V: Visitor<'de>,
672    {
673        // Detect `#[serde(flatten)]` as a struct deserialised as a map
674        const SERDE_FLATTEN_CANARY: &[u8] = b"struct ";
675
676        struct VisitorExpecting<V>(V);
677        impl<'de, V: Visitor<'de>> std::fmt::Display for VisitorExpecting<&'_ V> {
678            fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
679                self.0.expecting(fmt)
680            }
681        }
682
683        self.newtype_variant = false;
684
685        let mut canary_buffer = [0u8; SERDE_FLATTEN_CANARY.len()];
686        std::mem::drop(write!(
687            canary_buffer.as_mut(),
688            "{}",
689            VisitorExpecting(&visitor)
690        ));
691        let terminator = if canary_buffer == SERDE_FLATTEN_CANARY {
692            Terminator::MapAsStruct
693        } else {
694            Terminator::Map
695        };
696
697        if self.parser.consume_char('{') {
698            let value = guard_recursion! { self =>
699                visitor.visit_map(CommaSeparated::new(terminator, self))?
700            };
701            self.parser.skip_ws()?;
702
703            if self.parser.consume_char('}') {
704                Ok(value)
705            } else {
706                Err(Error::ExpectedMapEnd)
707            }
708        } else {
709            Err(Error::ExpectedMap)
710        }
711    }
712
713    fn deserialize_struct<V>(
714        self,
715        name: &'static str,
716        _fields: &'static [&'static str],
717        visitor: V,
718    ) -> Result<V::Value>
719    where
720        V: Visitor<'de>,
721    {
722        if !self.newtype_variant {
723            self.parser.consume_struct_name(name)?;
724        }
725
726        self.parser.skip_ws()?;
727
728        self.handle_struct_after_name(name, visitor)
729    }
730
731    fn deserialize_enum<V>(
732        self,
733        name: &'static str,
734        _variants: &'static [&'static str],
735        visitor: V,
736    ) -> Result<V::Value>
737    where
738        V: Visitor<'de>,
739    {
740        self.newtype_variant = false;
741
742        match guard_recursion! { self => visitor.visit_enum(Enum::new(self)) } {
743            Ok(value) => Ok(value),
744            Err(Error::NoSuchEnumVariant {
745                expected,
746                found,
747                outer: None,
748            }) if !name.is_empty() => Err(Error::NoSuchEnumVariant {
749                expected,
750                found,
751                outer: Some(String::from(name)),
752            }),
753            Err(e) => Err(e),
754        }
755    }
756
757    fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
758    where
759        V: Visitor<'de>,
760    {
761        let identifier = self.parser.identifier()?;
762
763        self.last_identifier = Some(identifier);
764
765        visitor.visit_borrowed_str(identifier)
766    }
767
768    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
769    where
770        V: Visitor<'de>,
771    {
772        self.deserialize_any(visitor)
773    }
774}
775
776enum Terminator {
777    Map,
778    MapAsStruct,
779    Tuple,
780    Struct,
781    Seq,
782}
783
784impl Terminator {
785    fn as_char(&self) -> char {
786        match self {
787            Terminator::Map | Terminator::MapAsStruct => '}',
788            Terminator::Tuple | Terminator::Struct => ')',
789            Terminator::Seq => ']',
790        }
791    }
792}
793
794struct CommaSeparated<'a, 'de: 'a> {
795    de: &'a mut Deserializer<'de>,
796    terminator: Terminator,
797    had_comma: bool,
798    inside_internally_tagged_enum: bool,
799}
800
801impl<'a, 'de> CommaSeparated<'a, 'de> {
802    fn new(terminator: Terminator, de: &'a mut Deserializer<'de>) -> Self {
803        CommaSeparated {
804            de,
805            terminator,
806            had_comma: true,
807            inside_internally_tagged_enum: false,
808        }
809    }
810
811    fn has_element(&mut self) -> Result<bool> {
812        self.de.parser.skip_ws()?;
813
814        match (
815            self.had_comma,
816            !self.de.parser.check_char(self.terminator.as_char()),
817        ) {
818            // Trailing comma, maybe has a next element
819            (true, has_element) => Ok(has_element),
820            // No trailing comma but terminator
821            (false, false) => Ok(false),
822            // No trailing comma or terminator
823            (false, true) => Err(Error::ExpectedComma),
824        }
825    }
826}
827
828impl<'de, 'a> de::SeqAccess<'de> for CommaSeparated<'a, 'de> {
829    type Error = Error;
830
831    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
832    where
833        T: DeserializeSeed<'de>,
834    {
835        if self.has_element()? {
836            let res = guard_recursion! { self.de => seed.deserialize(&mut *self.de)? };
837
838            self.had_comma = self.de.parser.comma()?;
839
840            Ok(Some(res))
841        } else {
842            Ok(None)
843        }
844    }
845}
846
847impl<'de, 'a> de::MapAccess<'de> for CommaSeparated<'a, 'de> {
848    type Error = Error;
849
850    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
851    where
852        K: DeserializeSeed<'de>,
853    {
854        if self.has_element()? {
855            self.inside_internally_tagged_enum =
856                std::any::type_name::<K::Value>() == SERDE_TAG_KEY_CANARY;
857
858            match self.terminator {
859                Terminator::Struct => guard_recursion! { self.de =>
860                    seed.deserialize(&mut id::Deserializer::new(&mut *self.de, false)).map(Some)
861                },
862                Terminator::MapAsStruct => guard_recursion! { self.de =>
863                    seed.deserialize(&mut id::Deserializer::new(&mut *self.de, true)).map(Some)
864                },
865                _ => guard_recursion! { self.de => seed.deserialize(&mut *self.de).map(Some) },
866            }
867        } else {
868            Ok(None)
869        }
870    }
871
872    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
873    where
874        V: DeserializeSeed<'de>,
875    {
876        self.de.parser.skip_ws()?;
877
878        if self.de.parser.consume_char(':') {
879            self.de.parser.skip_ws()?;
880
881            let res = if self.inside_internally_tagged_enum
882                && std::any::type_name::<V::Value>() != SERDE_CONTENT_CANARY
883            {
884                guard_recursion! { self.de =>
885                    seed.deserialize(&mut tag::Deserializer::new(&mut *self.de))?
886                }
887            } else {
888                guard_recursion! { self.de =>
889                    seed.deserialize(&mut *self.de)?
890                }
891            };
892
893            self.had_comma = self.de.parser.comma()?;
894
895            Ok(res)
896        } else {
897            Err(Error::ExpectedMapColon)
898        }
899    }
900}
901
902struct Enum<'a, 'de: 'a> {
903    de: &'a mut Deserializer<'de>,
904}
905
906impl<'a, 'de> Enum<'a, 'de> {
907    fn new(de: &'a mut Deserializer<'de>) -> Self {
908        Enum { de }
909    }
910}
911
912impl<'de, 'a> de::EnumAccess<'de> for Enum<'a, 'de> {
913    type Error = Error;
914    type Variant = Self;
915
916    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)>
917    where
918        V: DeserializeSeed<'de>,
919    {
920        self.de.parser.skip_ws()?;
921
922        let value = guard_recursion! { self.de => seed.deserialize(&mut *self.de)? };
923
924        Ok((value, self))
925    }
926}
927
928impl<'de, 'a> de::VariantAccess<'de> for Enum<'a, 'de> {
929    type Error = Error;
930
931    fn unit_variant(self) -> Result<()> {
932        Ok(())
933    }
934
935    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
936    where
937        T: DeserializeSeed<'de>,
938    {
939        let newtype_variant = self.de.last_identifier;
940
941        self.de.parser.skip_ws()?;
942
943        if self.de.parser.consume_char('(') {
944            self.de.parser.skip_ws()?;
945
946            self.de.newtype_variant = self
947                .de
948                .parser
949                .exts
950                .contains(Extensions::UNWRAP_VARIANT_NEWTYPES);
951
952            let val = guard_recursion! { self.de =>
953                seed
954                    .deserialize(&mut *self.de)
955                    .map_err(|err| struct_error_name(err, newtype_variant))?
956            };
957
958            self.de.newtype_variant = false;
959
960            self.de.parser.comma()?;
961
962            if self.de.parser.consume_char(')') {
963                Ok(val)
964            } else {
965                Err(Error::ExpectedStructLikeEnd)
966            }
967        } else {
968            Err(Error::ExpectedStructLike)
969        }
970    }
971
972    fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value>
973    where
974        V: Visitor<'de>,
975    {
976        self.de.parser.skip_ws()?;
977
978        self.de.deserialize_tuple(len, visitor)
979    }
980
981    fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value>
982    where
983        V: Visitor<'de>,
984    {
985        let struct_variant = self.de.last_identifier;
986
987        self.de.parser.skip_ws()?;
988
989        self.de
990            .handle_struct_after_name("", visitor)
991            .map_err(|err| struct_error_name(err, struct_variant))
992    }
993}
994
995fn struct_error_name(error: Error, name: Option<&str>) -> Error {
996    match error {
997        Error::NoSuchStructField {
998            expected,
999            found,
1000            outer: None,
1001        } => Error::NoSuchStructField {
1002            expected,
1003            found,
1004            outer: name.map(ToOwned::to_owned),
1005        },
1006        Error::MissingStructField { field, outer: None } => Error::MissingStructField {
1007            field,
1008            outer: name.map(ToOwned::to_owned),
1009        },
1010        Error::DuplicateStructField { field, outer: None } => Error::DuplicateStructField {
1011            field,
1012            outer: name.map(ToOwned::to_owned),
1013        },
1014        e => e,
1015    }
1016}
1017
1018struct SerdeEnumContent<'a, 'de: 'a> {
1019    de: &'a mut Deserializer<'de>,
1020    ident: Option<&'a str>,
1021}
1022
1023impl<'de, 'a> de::MapAccess<'de> for SerdeEnumContent<'a, 'de> {
1024    type Error = Error;
1025
1026    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
1027    where
1028        K: DeserializeSeed<'de>,
1029    {
1030        self.ident
1031            .take()
1032            .map(|ident| seed.deserialize(serde::de::value::StrDeserializer::new(ident)))
1033            .transpose()
1034    }
1035
1036    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
1037    where
1038        V: DeserializeSeed<'de>,
1039    {
1040        self.de.parser.skip_ws()?;
1041
1042        let old_serde_content_newtype = self.de.serde_content_newtype;
1043        self.de.serde_content_newtype = true;
1044        let result = seed.deserialize(&mut *self.de);
1045        self.de.serde_content_newtype = old_serde_content_newtype;
1046
1047        result
1048    }
1049}