ron/de/
mod.rs

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