Skip to main content

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    value::NumberDeserializer,
21};
22
23#[cfg(feature = "std")]
24use std::io;
25
26mod id;
27mod tag;
28#[cfg(test)]
29mod tests;
30mod value;
31
32/// The RON deserializer.
33///
34/// If you just want to simply deserialize a value,
35/// you can use the [`from_str`] convenience function.
36pub struct Deserializer<'de> {
37    pub(crate) parser: Parser<'de>,
38    newtype_variant: bool,
39    serde_content_newtype: bool,
40    last_identifier: Option<&'de str>,
41    recursion_limit: Option<usize>,
42}
43
44impl<'de> Deserializer<'de> {
45    // Cannot implement trait here since output is tied to input lifetime 'de.
46    #[allow(clippy::should_implement_trait)]
47    pub fn from_str(input: &'de str) -> SpannedResult<Self> {
48        Self::from_str_with_options(input, &Options::default())
49    }
50
51    pub fn from_bytes(input: &'de [u8]) -> SpannedResult<Self> {
52        Self::from_bytes_with_options(input, &Options::default())
53    }
54
55    pub fn from_str_with_options(input: &'de str, options: &Options) -> SpannedResult<Self> {
56        let mut deserializer = Deserializer {
57            parser: Parser::new(input)?,
58            newtype_variant: false,
59            serde_content_newtype: false,
60            last_identifier: None,
61            recursion_limit: options.recursion_limit,
62        };
63
64        deserializer.parser.exts |= options.default_extensions;
65
66        Ok(deserializer)
67    }
68
69    // FIXME: panic is not actually possible, remove once utf8_chunks is stabilized
70    #[allow(clippy::missing_panics_doc)]
71    pub fn from_bytes_with_options(input: &'de [u8], options: &Options) -> SpannedResult<Self> {
72        let err = match str::from_utf8(input) {
73            Ok(input) => return Self::from_str_with_options(input, options),
74            Err(err) => err,
75        };
76
77        // FIXME: use [`utf8_chunks`](https://github.com/rust-lang/rust/issues/99543) once stabilised
78        #[allow(clippy::expect_used)]
79        let valid_input =
80            str::from_utf8(&input[..err.valid_up_to()]).expect("source is valid up to error");
81
82        Err(SpannedError {
83            code: err.into(),
84            span: Span {
85                start: Position { line: 1, col: 1 },
86                end: Position::from_src_end(valid_input),
87            },
88        })
89    }
90
91    #[must_use]
92    pub fn remainder(&self) -> &'de str {
93        self.parser.src()
94    }
95
96    #[must_use]
97    pub fn span_error(&self, code: Error) -> SpannedError {
98        self.parser.span_error(code)
99    }
100
101    #[must_use]
102    pub fn extensions(&self) -> Extensions {
103        self.parser.exts
104    }
105}
106
107/// A convenience function for building a deserializer
108/// and deserializing a value of type `T` from a reader.
109#[cfg(feature = "std")]
110pub fn from_reader<R, T>(rdr: R) -> SpannedResult<T>
111where
112    R: io::Read,
113    T: de::DeserializeOwned,
114{
115    Options::default().from_reader(rdr)
116}
117
118/// A convenience function for building a deserializer
119/// and deserializing a value of type `T` from a string.
120pub fn from_str<'a, T>(s: &'a str) -> SpannedResult<T>
121where
122    T: de::Deserialize<'a>,
123{
124    Options::default().from_str(s)
125}
126
127/// A convenience function for building a deserializer
128/// and deserializing a value of type `T` from bytes.
129pub fn from_bytes<'a, T>(s: &'a [u8]) -> SpannedResult<T>
130where
131    T: de::Deserialize<'a>,
132{
133    Options::default().from_bytes(s)
134}
135
136macro_rules! guard_recursion {
137    ($self:expr => $expr:expr) => {{
138        if let Some(limit) = &mut $self.recursion_limit {
139            if let Some(new_limit) = limit.checked_sub(1) {
140                *limit = new_limit;
141            } else {
142                return Err(Error::ExceededRecursionLimit);
143            }
144        }
145
146        let result = $expr;
147
148        if let Some(limit) = &mut $self.recursion_limit {
149            *limit = limit.saturating_add(1);
150        }
151
152        result
153    }};
154}
155
156impl<'de> Deserializer<'de> {
157    /// Check if the remaining bytes are whitespace only,
158    /// otherwise return an error.
159    pub fn end(&mut self) -> Result<()> {
160        self.parser.skip_ws()?;
161
162        if self.parser.src().is_empty() {
163            Ok(())
164        } else {
165            Err(Error::TrailingCharacters)
166        }
167    }
168
169    /// Called from [`deserialize_any`][serde::Deserializer::deserialize_any]
170    /// when a struct was detected. Decides if there is a unit, tuple or usual
171    /// struct and deserializes it accordingly.
172    ///
173    /// This method assumes there is no identifier left.
174    fn handle_any_struct<V>(&mut self, visitor: V, ident: Option<&str>) -> Result<V::Value>
175    where
176        V: Visitor<'de>,
177    {
178        // HACK: switch to JSON enum semantics for JSON content
179        // Robust impl blocked on https://github.com/serde-rs/serde/issues/1183
180        let is_serde_content =
181            is_serde_content::<V::Value>() || is_serde_tag_or_content::<V::Value>();
182
183        let old_serde_content_newtype = self.serde_content_newtype;
184        self.serde_content_newtype = false;
185
186        match (
187            self.parser.check_struct_type(
188                NewtypeMode::NoParensMeanUnit,
189                if old_serde_content_newtype {
190                    TupleMode::DifferentiateNewtype // separate match on NewtypeOrTuple below
191                } else {
192                    TupleMode::ImpreciseTupleOrNewtype // Tuple and NewtypeOrTuple match equally
193                },
194            )?,
195            ident,
196        ) {
197            (StructType::Unit, Some(ident)) if is_serde_content => {
198                // serde's Content type needs the ident for unit variants
199                visitor.visit_str(ident)
200            }
201            (StructType::Unit, _) => visitor.visit_unit(),
202            (_, Some(ident)) if is_serde_content => {
203                // serde's Content type uses a singleton map encoding for enums
204                visitor.visit_map(SerdeEnumContent {
205                    de: self,
206                    ident: Some(ident),
207                })
208            }
209            (StructType::Named, _) => {
210                // giving no name results in worse errors but is necessary here
211                self.handle_struct_after_name("", visitor)
212            }
213            (StructType::NewtypeTuple, _) if old_serde_content_newtype => {
214                // deserialize a newtype struct or variant
215                self.parser.consume_char('(');
216                self.parser.skip_ws()?;
217                let result = self.deserialize_any(visitor);
218                self.parser.skip_ws()?;
219                self.parser.consume_char(')');
220
221                result
222            }
223            (
224                StructType::AnyTuple
225                | StructType::EmptyTuple
226                | StructType::NewtypeTuple
227                | StructType::NonNewtypeTuple,
228                _,
229            ) => {
230                // first argument is technically incorrect, but ignored anyway
231                self.deserialize_tuple(0, visitor)
232            }
233        }
234    }
235
236    fn handle_float_range_or_value<V>(
237        &mut self,
238        number: crate::value::Number,
239        visitor: V,
240    ) -> Result<V::Value>
241    where
242        V: Visitor<'de>,
243    {
244        if self.parser.consume_str("..=") {
245            let end = self.parser.any_number()?;
246            return visitor.visit_map(RangeMapAccess::new(number, end, "end"));
247        } else if self.parser.consume_str("..") {
248            if self
249                .parser
250                .peek_char()
251                .map_or(true, |c| !self.parser.is_number_start(c))
252            {
253                return visitor.visit_map(RangeFromMapAccess::new(number));
254            }
255            let end = self.parser.any_number()?;
256            return visitor.visit_map(RangeMapAccess::new(number, end, "end"));
257        }
258        number.visit(visitor)
259    }
260
261    /// Called from
262    /// [`deserialize_struct`][serde::Deserializer::deserialize_struct],
263    /// [`struct_variant`][serde::de::VariantAccess::struct_variant], and
264    /// [`handle_any_struct`][Self::handle_any_struct]. Handles
265    /// deserialising the enclosing parentheses and everything in between.
266    ///
267    /// This method assumes there is no struct name identifier left.
268    fn handle_struct_after_name<V>(
269        &mut self,
270        name_for_pretty_errors_only: &'static str,
271        visitor: V,
272    ) -> Result<V::Value>
273    where
274        V: Visitor<'de>,
275    {
276        if self.newtype_variant || self.parser.consume_char('(') {
277            let old_newtype_variant = self.newtype_variant;
278            self.newtype_variant = false;
279
280            let value = guard_recursion! { self =>
281                visitor
282                    .visit_map(CommaSeparated::new(Terminator::Struct, self))
283                    .map_err(|err| {
284                        struct_error_name(
285                            err,
286                            if !old_newtype_variant && !name_for_pretty_errors_only.is_empty() {
287                                Some(name_for_pretty_errors_only)
288                            } else {
289                                None
290                            },
291                        )
292                    })?
293            };
294
295            self.parser.skip_ws()?;
296
297            if old_newtype_variant || self.parser.consume_char(')') {
298                Ok(value)
299            } else {
300                Err(Error::ExpectedStructLikeEnd)
301            }
302        } else if name_for_pretty_errors_only.is_empty() {
303            Err(Error::ExpectedStructLike)
304        } else {
305            Err(Error::ExpectedNamedStructLike(name_for_pretty_errors_only))
306        }
307    }
308}
309
310impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
311    type Error = Error;
312
313    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
314    where
315        V: Visitor<'de>,
316    {
317        if self.newtype_variant {
318            if self.parser.check_char(')') {
319                // newtype variant wraps the unit type / a unit struct without name
320                return self.deserialize_unit(visitor);
321            }
322
323            #[allow(clippy::wildcard_in_or_patterns)]
324            match self
325                .parser
326                .check_struct_type(NewtypeMode::InsideNewtype, TupleMode::DifferentiateNewtype)?
327            {
328                StructType::Named => {
329                    // newtype variant wraps a named struct
330                    // giving no name results in worse errors but is necessary here
331                    return self.handle_struct_after_name("", visitor);
332                }
333                StructType::EmptyTuple | StructType::NonNewtypeTuple => {
334                    // newtype variant wraps a tuple (struct)
335                    // first argument is technically incorrect, but ignored anyway
336                    return self.deserialize_tuple(0, visitor);
337                }
338                // StructType::Unit is impossible with NewtypeMode::InsideNewtype
339                // StructType::AnyTuple is impossible with TupleMode::DifferentiateNewtype
340                StructType::NewtypeTuple | _ => {
341                    // continue as usual with the inner content of the newtype variant
342                    self.newtype_variant = false;
343                }
344            }
345        }
346
347        if self.parser.consume_ident("true") {
348            return visitor.visit_bool(true);
349        } else if self.parser.consume_ident("false") {
350            return visitor.visit_bool(false);
351        } else if self.parser.check_ident("Some") {
352            return self.deserialize_option(visitor);
353        } else if self.parser.consume_ident("None") {
354            return visitor.visit_none();
355        } else if self.parser.consume_str("()") {
356            return visitor.visit_unit();
357        } else if self.parser.consume_ident("inf") || self.parser.consume_ident("inff32") {
358            let number = crate::value::Number::F32(crate::value::F32(core::f32::INFINITY));
359            return self.handle_float_range_or_value(number, visitor);
360        } else if self.parser.consume_ident("inff64") {
361            let number = crate::value::Number::F64(crate::value::F64(core::f64::INFINITY));
362            return self.handle_float_range_or_value(number, visitor);
363        } else if self.parser.consume_ident("NaN") || self.parser.consume_ident("NaNf32") {
364            let number = crate::value::Number::F32(crate::value::F32(core::f32::NAN));
365            return self.handle_float_range_or_value(number, visitor);
366        } else if self.parser.consume_ident("NaNf64") {
367            let number = crate::value::Number::F64(crate::value::F64(core::f64::NAN));
368            return self.handle_float_range_or_value(number, visitor);
369        }
370
371        // `skip_identifier` does not change state if it fails
372        if let Some(ident) = self.parser.skip_identifier() {
373            self.parser.skip_ws()?;
374
375            return self.handle_any_struct(visitor, Some(ident));
376        }
377
378        match self.parser.peek_char_or_eof()? {
379            '(' => self.handle_any_struct(visitor, None),
380            '[' => self.deserialize_seq(visitor),
381            '{' => self.deserialize_map(visitor),
382            '0'..='9' | '+' | '-' | '.' | 'b' => {
383                if self.parser.check_char('b') && !self.parser.src().starts_with("b'") {
384                    return self.deserialize_byte_buf(visitor);
385                }
386
387                if self.parser.check_str("..=") {
388                    self.parser.consume_str("..=");
389                    let end = self.parser.any_number()?;
390                    return visitor.visit_map(RangeToMapAccess::new(end, "end"));
391                }
392
393                if self.parser.check_str("..") {
394                    let after_dots = &self.parser.src()[2..];
395                    if after_dots.starts_with(|c: char| self.parser.is_number_start(c)) {
396                        self.parser.consume_str("..");
397                        let end = self.parser.any_number()?;
398                        return visitor.visit_map(RangeToMapAccess::new(end, "end"));
399                    }
400                    self.parser.consume_str("..");
401                    return visitor.visit_unit();
402                }
403
404                let start = self.parser.any_number()?;
405
406                self.handle_float_range_or_value(start, visitor)
407            }
408            '"' | 'r' => self.deserialize_string(visitor),
409            '\'' => self.deserialize_char(visitor),
410            other => Err(Error::UnexpectedChar(other)),
411        }
412    }
413
414    fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
415    where
416        V: Visitor<'de>,
417    {
418        visitor.visit_bool(self.parser.bool()?)
419    }
420
421    fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value>
422    where
423        V: Visitor<'de>,
424    {
425        visitor.visit_i8(self.parser.integer()?)
426    }
427
428    fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value>
429    where
430        V: Visitor<'de>,
431    {
432        visitor.visit_i16(self.parser.integer()?)
433    }
434
435    fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value>
436    where
437        V: Visitor<'de>,
438    {
439        visitor.visit_i32(self.parser.integer()?)
440    }
441
442    fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value>
443    where
444        V: Visitor<'de>,
445    {
446        visitor.visit_i64(self.parser.integer()?)
447    }
448
449    #[cfg(feature = "integer128")]
450    fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value>
451    where
452        V: Visitor<'de>,
453    {
454        visitor.visit_i128(self.parser.integer()?)
455    }
456
457    fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value>
458    where
459        V: Visitor<'de>,
460    {
461        visitor.visit_u8(self.parser.integer()?)
462    }
463
464    fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value>
465    where
466        V: Visitor<'de>,
467    {
468        visitor.visit_u16(self.parser.integer()?)
469    }
470
471    fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value>
472    where
473        V: Visitor<'de>,
474    {
475        visitor.visit_u32(self.parser.integer()?)
476    }
477
478    fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value>
479    where
480        V: Visitor<'de>,
481    {
482        visitor.visit_u64(self.parser.integer()?)
483    }
484
485    #[cfg(feature = "integer128")]
486    fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value>
487    where
488        V: Visitor<'de>,
489    {
490        visitor.visit_u128(self.parser.integer()?)
491    }
492
493    fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value>
494    where
495        V: Visitor<'de>,
496    {
497        visitor.visit_f32(self.parser.float()?)
498    }
499
500    fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value>
501    where
502        V: Visitor<'de>,
503    {
504        visitor.visit_f64(self.parser.float()?)
505    }
506
507    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
508    where
509        V: Visitor<'de>,
510    {
511        visitor.visit_char(self.parser.char()?)
512    }
513
514    fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
515    where
516        V: Visitor<'de>,
517    {
518        match self.parser.string()? {
519            ParsedStr::Allocated(s) => visitor.visit_string(s),
520            ParsedStr::Slice(s) => visitor.visit_borrowed_str(s),
521        }
522    }
523
524    fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
525    where
526        V: Visitor<'de>,
527    {
528        self.deserialize_str(visitor)
529    }
530
531    fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
532    where
533        V: Visitor<'de>,
534    {
535        self.deserialize_byte_buf(visitor)
536    }
537
538    fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
539    where
540        V: Visitor<'de>,
541    {
542        if self.parser.check_char('[') {
543            let bytes = Vec::<u8>::deserialize(self)?;
544            return visitor.visit_byte_buf(bytes);
545        }
546
547        match self.parser.byte_string()? {
548            ParsedByteStr::Allocated(byte_buf) => visitor.visit_byte_buf(byte_buf),
549            ParsedByteStr::Slice(bytes) => visitor.visit_borrowed_bytes(bytes),
550        }
551    }
552
553    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
554    where
555        V: Visitor<'de>,
556    {
557        if self.parser.consume_ident("None") {
558            visitor.visit_none()
559        } else if self.parser.consume_ident("Some") && {
560            self.parser.skip_ws()?;
561            self.parser.consume_char('(')
562        } {
563            self.parser.skip_ws()?;
564
565            self.newtype_variant = self
566                .parser
567                .exts
568                .contains(Extensions::UNWRAP_VARIANT_NEWTYPES);
569
570            let v = guard_recursion! { self => visitor.visit_some(&mut *self)? };
571
572            self.newtype_variant = false;
573
574            self.parser.comma()?;
575
576            if self.parser.consume_char(')') {
577                Ok(v)
578            } else {
579                Err(Error::ExpectedOptionEnd)
580            }
581        } else if self.parser.exts.contains(Extensions::IMPLICIT_SOME) {
582            guard_recursion! { self => visitor.visit_some(&mut *self) }
583        } else {
584            Err(Error::ExpectedOption)
585        }
586    }
587
588    // In Serde, unit means an anonymous value containing no data.
589    fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
590    where
591        V: Visitor<'de>,
592    {
593        if self.newtype_variant || self.parser.consume_str("()") {
594            self.newtype_variant = false;
595
596            visitor.visit_unit()
597        } else {
598            Err(Error::ExpectedUnit)
599        }
600    }
601
602    fn deserialize_unit_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
603    where
604        V: Visitor<'de>,
605    {
606        if name == "RangeFull" && self.parser.consume_str("..") {
607            return visitor.visit_unit();
608        }
609
610        if self.newtype_variant || self.parser.consume_struct_name(name)? {
611            self.newtype_variant = false;
612
613            visitor.visit_unit()
614        } else {
615            self.deserialize_unit(visitor)
616        }
617    }
618
619    fn deserialize_newtype_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
620    where
621        V: Visitor<'de>,
622    {
623        if name == crate::value::raw::RAW_VALUE_TOKEN {
624            let src_before = self.parser.pre_ws_src();
625            self.parser.skip_ws()?;
626            let _ignored = self.deserialize_ignored_any(de::IgnoredAny)?;
627            self.parser.skip_ws()?;
628            let src_after = self.parser.src();
629
630            if self.parser.has_unclosed_line_comment() {
631                return Err(Error::UnclosedLineComment);
632            }
633
634            let ron_str = &src_before[..src_before.len() - src_after.len()];
635
636            return visitor
637                .visit_borrowed_str::<Error>(ron_str)
638                .map_err(|_| Error::ExpectedRawValue);
639        }
640
641        if self.parser.exts.contains(Extensions::UNWRAP_NEWTYPES) || self.newtype_variant {
642            self.newtype_variant = false;
643
644            return guard_recursion! { self => visitor.visit_newtype_struct(&mut *self) };
645        }
646
647        self.parser.consume_struct_name(name)?;
648
649        self.parser.skip_ws()?;
650
651        if self.parser.consume_char('(') {
652            self.parser.skip_ws()?;
653            let value = guard_recursion! { self => visitor.visit_newtype_struct(&mut *self)? };
654            self.parser.comma()?;
655
656            if self.parser.consume_char(')') {
657                Ok(value)
658            } else {
659                Err(Error::ExpectedStructLikeEnd)
660            }
661        } else if name.is_empty() {
662            Err(Error::ExpectedStructLike)
663        } else {
664            Err(Error::ExpectedNamedStructLike(name))
665        }
666    }
667
668    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
669    where
670        V: Visitor<'de>,
671    {
672        self.newtype_variant = false;
673
674        if self.parser.consume_char('[') {
675            let value = guard_recursion! { self =>
676                visitor.visit_seq(CommaSeparated::new(Terminator::Seq, self))?
677            };
678            self.parser.skip_ws()?;
679
680            if self.parser.consume_char(']') {
681                Ok(value)
682            } else {
683                Err(Error::ExpectedArrayEnd)
684            }
685        } else {
686            Err(Error::ExpectedArray)
687        }
688    }
689
690    fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
691    where
692        V: Visitor<'de>,
693    {
694        if self.newtype_variant || self.parser.consume_char('(') {
695            let old_newtype_variant = self.newtype_variant;
696            self.newtype_variant = false;
697
698            let value = guard_recursion! { self =>
699                visitor.visit_seq(CommaSeparated::new(Terminator::Tuple, self))?
700            };
701            self.parser.skip_ws()?;
702
703            if old_newtype_variant || self.parser.consume_char(')') {
704                Ok(value)
705            } else {
706                Err(Error::ExpectedStructLikeEnd)
707            }
708        } else {
709            Err(Error::ExpectedStructLike)
710        }
711    }
712
713    fn deserialize_tuple_struct<V>(
714        self,
715        name: &'static str,
716        len: usize,
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.deserialize_tuple(len, visitor).map_err(|e| match e {
727            Error::ExpectedStructLike if !name.is_empty() => Error::ExpectedNamedStructLike(name),
728            e => e,
729        })
730    }
731
732    fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
733    where
734        V: Visitor<'de>,
735    {
736        struct VisitorExpecting<V>(V);
737        impl<'de, V: Visitor<'de>> core::fmt::Display for VisitorExpecting<&'_ V> {
738            fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result {
739                self.0.expecting(fmt)
740            }
741        }
742
743        self.newtype_variant = false;
744
745        // TODO: Avoid allocating to perform this check.
746        let serde_flatten_canary = VisitorExpecting(&visitor)
747            .to_string()
748            .starts_with("struct ");
749
750        let terminator = if serde_flatten_canary {
751            Terminator::MapAsStruct
752        } else {
753            Terminator::Map
754        };
755
756        if self.parser.consume_char('{') {
757            let value = guard_recursion! { self =>
758                visitor.visit_map(CommaSeparated::new(terminator, self))?
759            };
760            self.parser.skip_ws()?;
761
762            if self.parser.consume_char('}') {
763                Ok(value)
764            } else {
765                Err(Error::ExpectedMapEnd)
766            }
767        } else {
768            Err(Error::ExpectedMap)
769        }
770    }
771
772    fn deserialize_struct<V>(
773        self,
774        name: &'static str,
775        fields: &'static [&'static str],
776        visitor: V,
777    ) -> Result<V::Value>
778    where
779        V: Visitor<'de>,
780    {
781        // `RangeInclusive` used `last` as field name before it was renamed to `end` in a newer Rust version
782        if (name == "Range" && fields == ["start", "end"])
783            || (name == "RangeInclusive" && matches!(fields, ["start", "end" | "last"]))
784        {
785            let end_field = fields[1];
786            if let Some(c) = self.parser.peek_char() {
787                if self.parser.is_number_start(c) {
788                    let start = self.parser.any_number()?;
789
790                    let inclusive = if self.parser.consume_str("..=") {
791                        true
792                    } else if self.parser.consume_str("..") {
793                        false
794                    } else {
795                        return Err(Error::ExpectedRangeSyntax);
796                    };
797
798                    if inclusive && name == "Range" {
799                        return Err(Error::Message(String::from(
800                            "expected `..` for `Range`, found `..=`",
801                        )));
802                    }
803                    if !inclusive && name == "RangeInclusive" {
804                        return Err(Error::Message(String::from(
805                            "expected `..=` for `RangeInclusive`, found `..`",
806                        )));
807                    }
808
809                    let end = self.parser.any_number()?;
810                    return visitor.visit_map(RangeMapAccess::new(start, end, end_field));
811                }
812            }
813        }
814
815        if fields == ["start"] && name == "RangeFrom" {
816            if let Some(c) = self.parser.peek_char() {
817                if self.parser.is_number_start(c)
818                    || self.parser.check_ident("inf")
819                    || self.parser.check_ident("inff32")
820                    || self.parser.check_ident("inff64")
821                    || self.parser.check_ident("NaN")
822                    || self.parser.check_ident("NaNf32")
823                    || self.parser.check_ident("NaNf64")
824                {
825                    let start = self.parser.any_number()?;
826                    if self.parser.consume_str("..=") {
827                        return Err(Error::Message(String::from(
828                            "expected `..` for `RangeFrom`, found `..=`",
829                        )));
830                    } else if !self.parser.consume_str("..") {
831                        return Err(Error::ExpectedRangeSyntax);
832                    }
833                    return visitor.visit_map(RangeFromMapAccess::new(start));
834                }
835            }
836        }
837
838        if fields == ["end"]
839            && name == "RangeTo"
840            && (self.parser.check_str("..=") || self.parser.check_str(".."))
841        {
842            if self.parser.consume_str("..=") {
843                return Err(Error::Message(String::from(
844                    "expected `..` for `RangeTo`, found `..=`",
845                )));
846            }
847            self.parser.consume_str("..");
848            let end = self.parser.any_number()?;
849            return visitor.visit_map(RangeToMapAccess::new(end, "end"));
850        }
851
852        // `last` is the old field name for `RangeToInclusive`, replaced by `end` in a newer Rust version
853        if matches!(fields, ["end" | "last"])
854            && name == "RangeToInclusive"
855            && (self.parser.check_str("..=") || self.parser.check_str(".."))
856        {
857            if !self.parser.consume_str("..=") {
858                self.parser.consume_str("..");
859                return Err(Error::Message(String::from(
860                    "expected `..=` for `RangeToInclusive`, found `..`",
861                )));
862            }
863            let end = self.parser.any_number()?;
864            return visitor.visit_map(RangeToMapAccess::new(end, fields[0]));
865        }
866
867        if !self.newtype_variant {
868            self.parser.consume_struct_name(name)?;
869        }
870
871        self.parser.skip_ws()?;
872
873        self.handle_struct_after_name(name, visitor)
874    }
875
876    fn deserialize_enum<V>(
877        self,
878        name: &'static str,
879        _variants: &'static [&'static str],
880        visitor: V,
881    ) -> Result<V::Value>
882    where
883        V: Visitor<'de>,
884    {
885        self.newtype_variant = false;
886
887        match guard_recursion! { self => visitor.visit_enum(Enum::new(self)) } {
888            Ok(value) => Ok(value),
889            Err(Error::NoSuchEnumVariant {
890                expected,
891                found,
892                outer: None,
893            }) if !name.is_empty() => Err(Error::NoSuchEnumVariant {
894                expected,
895                found,
896                outer: Some(String::from(name)),
897            }),
898            Err(e) => Err(e),
899        }
900    }
901
902    fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
903    where
904        V: Visitor<'de>,
905    {
906        let identifier = self.parser.identifier()?;
907
908        self.last_identifier = Some(identifier);
909
910        visitor.visit_borrowed_str(identifier)
911    }
912
913    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
914    where
915        V: Visitor<'de>,
916    {
917        self.deserialize_any(visitor)
918    }
919}
920
921enum Terminator {
922    Map,
923    MapAsStruct,
924    Tuple,
925    Struct,
926    Seq,
927}
928
929impl Terminator {
930    fn as_char(&self) -> char {
931        match self {
932            Terminator::Map | Terminator::MapAsStruct => '}',
933            Terminator::Tuple | Terminator::Struct => ')',
934            Terminator::Seq => ']',
935        }
936    }
937}
938
939struct CommaSeparated<'a, 'de: 'a> {
940    de: &'a mut Deserializer<'de>,
941    terminator: Terminator,
942    had_comma: bool,
943    inside_internally_tagged_enum: bool,
944}
945
946impl<'a, 'de> CommaSeparated<'a, 'de> {
947    fn new(terminator: Terminator, de: &'a mut Deserializer<'de>) -> Self {
948        CommaSeparated {
949            de,
950            terminator,
951            had_comma: true,
952            inside_internally_tagged_enum: false,
953        }
954    }
955
956    fn has_element(&mut self) -> Result<bool> {
957        self.de.parser.skip_ws()?;
958
959        match (
960            self.had_comma,
961            !self.de.parser.check_char(self.terminator.as_char()),
962        ) {
963            // Trailing comma, maybe has a next element
964            (true, has_element) => Ok(has_element),
965            // No trailing comma but terminator
966            (false, false) => Ok(false),
967            // No trailing comma or terminator
968            (false, true) => Err(Error::ExpectedComma),
969        }
970    }
971}
972
973enum RangeMapState {
974    StartKey,
975    StartValue,
976    EndKey,
977    EndValue,
978    Done,
979}
980
981struct RangeMapAccess {
982    start: crate::value::Number,
983    end: crate::value::Number,
984    state: RangeMapState,
985    end_key: &'static str,
986}
987
988impl RangeMapAccess {
989    fn new(start: crate::value::Number, end: crate::value::Number, end_key: &'static str) -> Self {
990        RangeMapAccess {
991            start,
992            end,
993            state: RangeMapState::StartKey,
994            end_key,
995        }
996    }
997}
998
999impl<'de> de::MapAccess<'de> for RangeMapAccess {
1000    type Error = Error;
1001
1002    fn next_key_seed<K: de::DeserializeSeed<'de>>(&mut self, seed: K) -> Result<Option<K::Value>> {
1003        match self.state {
1004            RangeMapState::StartKey => {
1005                self.state = RangeMapState::StartValue;
1006                seed.deserialize(de::value::StrDeserializer::<Error>::new("start"))
1007                    .map(Some)
1008            }
1009            RangeMapState::EndKey => {
1010                self.state = RangeMapState::EndValue;
1011                seed.deserialize(de::value::StrDeserializer::<Error>::new(self.end_key))
1012                    .map(Some)
1013            }
1014            _ => Ok(None),
1015        }
1016    }
1017
1018    fn next_value_seed<V: de::DeserializeSeed<'de>>(&mut self, seed: V) -> Result<V::Value> {
1019        match self.state {
1020            RangeMapState::StartValue => {
1021                self.state = RangeMapState::EndKey;
1022                seed.deserialize(NumberDeserializer(self.start))
1023            }
1024            RangeMapState::EndValue => {
1025                self.state = RangeMapState::Done;
1026                seed.deserialize(NumberDeserializer(self.end))
1027            }
1028            _ => Err(Error::ExpectedDifferentLength {
1029                expected: String::from("map of length 2"),
1030                found: 3,
1031            }),
1032        }
1033    }
1034}
1035
1036struct RangeFromMapAccess {
1037    start: crate::value::Number,
1038    done: bool,
1039}
1040
1041impl RangeFromMapAccess {
1042    fn new(start: crate::value::Number) -> Self {
1043        RangeFromMapAccess { start, done: false }
1044    }
1045}
1046
1047impl<'de> de::MapAccess<'de> for RangeFromMapAccess {
1048    type Error = Error;
1049
1050    fn next_key_seed<K: de::DeserializeSeed<'de>>(&mut self, seed: K) -> Result<Option<K::Value>> {
1051        if self.done {
1052            return Ok(None);
1053        }
1054        seed.deserialize(de::value::StrDeserializer::<Error>::new("start"))
1055            .map(Some)
1056    }
1057
1058    fn next_value_seed<V: de::DeserializeSeed<'de>>(&mut self, seed: V) -> Result<V::Value> {
1059        if self.done {
1060            return Err(Error::ExpectedDifferentLength {
1061                expected: String::from("map of length 1"),
1062                found: 2,
1063            });
1064        }
1065        self.done = true;
1066        seed.deserialize(NumberDeserializer(self.start))
1067    }
1068}
1069
1070struct RangeToMapAccess {
1071    end: crate::value::Number,
1072    end_key: &'static str,
1073    done: bool,
1074}
1075
1076impl RangeToMapAccess {
1077    fn new(end: crate::value::Number, end_key: &'static str) -> Self {
1078        RangeToMapAccess {
1079            end,
1080            end_key,
1081            done: false,
1082        }
1083    }
1084}
1085
1086impl<'de> de::MapAccess<'de> for RangeToMapAccess {
1087    type Error = Error;
1088
1089    fn next_key_seed<K: de::DeserializeSeed<'de>>(&mut self, seed: K) -> Result<Option<K::Value>> {
1090        if self.done {
1091            return Ok(None);
1092        }
1093        seed.deserialize(de::value::StrDeserializer::<Error>::new(self.end_key))
1094            .map(Some)
1095    }
1096
1097    fn next_value_seed<V: de::DeserializeSeed<'de>>(&mut self, seed: V) -> Result<V::Value> {
1098        if self.done {
1099            return Err(Error::ExpectedDifferentLength {
1100                expected: String::from("map of length 1"),
1101                found: 2,
1102            });
1103        }
1104        self.done = true;
1105        seed.deserialize(NumberDeserializer(self.end))
1106    }
1107}
1108
1109impl<'de, 'a> de::SeqAccess<'de> for CommaSeparated<'a, 'de> {
1110    type Error = Error;
1111
1112    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
1113    where
1114        T: DeserializeSeed<'de>,
1115    {
1116        if self.has_element()? {
1117            let res = guard_recursion! { self.de => seed.deserialize(&mut *self.de)? };
1118
1119            self.had_comma = self.de.parser.comma()?;
1120
1121            Ok(Some(res))
1122        } else {
1123            Ok(None)
1124        }
1125    }
1126}
1127
1128impl<'de, 'a> de::MapAccess<'de> for CommaSeparated<'a, 'de> {
1129    type Error = Error;
1130
1131    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
1132    where
1133        K: DeserializeSeed<'de>,
1134    {
1135        if self.has_element()? {
1136            self.inside_internally_tagged_enum = is_serde_tag_or_content::<K::Value>();
1137
1138            match self.terminator {
1139                Terminator::Struct => guard_recursion! { self.de =>
1140                    seed.deserialize(&mut id::Deserializer::new(&mut *self.de, false)).map(Some)
1141                },
1142                Terminator::MapAsStruct => guard_recursion! { self.de =>
1143                    seed.deserialize(&mut id::Deserializer::new(&mut *self.de, true)).map(Some)
1144                },
1145                _ => guard_recursion! { self.de => seed.deserialize(&mut *self.de).map(Some) },
1146            }
1147        } else {
1148            Ok(None)
1149        }
1150    }
1151
1152    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
1153    where
1154        V: DeserializeSeed<'de>,
1155    {
1156        self.de.parser.skip_ws()?;
1157
1158        if self.de.parser.consume_char(':') {
1159            self.de.parser.skip_ws()?;
1160
1161            let res = if self.inside_internally_tagged_enum && !is_serde_content::<V::Value>() {
1162                guard_recursion! { self.de =>
1163                    seed.deserialize(&mut tag::Deserializer::new(&mut *self.de))?
1164                }
1165            } else {
1166                guard_recursion! { self.de =>
1167                    seed.deserialize(&mut *self.de)?
1168                }
1169            };
1170
1171            self.had_comma = self.de.parser.comma()?;
1172
1173            Ok(res)
1174        } else {
1175            Err(Error::ExpectedMapColon)
1176        }
1177    }
1178}
1179
1180struct Enum<'a, 'de: 'a> {
1181    de: &'a mut Deserializer<'de>,
1182}
1183
1184impl<'a, 'de> Enum<'a, 'de> {
1185    fn new(de: &'a mut Deserializer<'de>) -> Self {
1186        Enum { de }
1187    }
1188}
1189
1190impl<'de, 'a> de::EnumAccess<'de> for Enum<'a, 'de> {
1191    type Error = Error;
1192    type Variant = Self;
1193
1194    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)>
1195    where
1196        V: DeserializeSeed<'de>,
1197    {
1198        self.de.parser.skip_ws()?;
1199
1200        let value = guard_recursion! { self.de => seed.deserialize(&mut *self.de)? };
1201
1202        Ok((value, self))
1203    }
1204}
1205
1206impl<'de, 'a> de::VariantAccess<'de> for Enum<'a, 'de> {
1207    type Error = Error;
1208
1209    fn unit_variant(self) -> Result<()> {
1210        Ok(())
1211    }
1212
1213    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
1214    where
1215        T: DeserializeSeed<'de>,
1216    {
1217        let newtype_variant = self.de.last_identifier;
1218
1219        self.de.parser.skip_ws()?;
1220
1221        if self.de.parser.consume_char('(') {
1222            self.de.parser.skip_ws()?;
1223
1224            self.de.newtype_variant = self
1225                .de
1226                .parser
1227                .exts
1228                .contains(Extensions::UNWRAP_VARIANT_NEWTYPES);
1229
1230            let val = guard_recursion! { self.de =>
1231                seed
1232                    .deserialize(&mut *self.de)
1233                    .map_err(|err| struct_error_name(err, newtype_variant))?
1234            };
1235
1236            self.de.newtype_variant = false;
1237
1238            self.de.parser.comma()?;
1239
1240            if self.de.parser.consume_char(')') {
1241                Ok(val)
1242            } else {
1243                Err(Error::ExpectedStructLikeEnd)
1244            }
1245        } else {
1246            Err(Error::ExpectedStructLike)
1247        }
1248    }
1249
1250    fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value>
1251    where
1252        V: Visitor<'de>,
1253    {
1254        self.de.parser.skip_ws()?;
1255
1256        self.de.deserialize_tuple(len, visitor)
1257    }
1258
1259    fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value>
1260    where
1261        V: Visitor<'de>,
1262    {
1263        let struct_variant = self.de.last_identifier;
1264
1265        self.de.parser.skip_ws()?;
1266
1267        self.de
1268            .handle_struct_after_name("", visitor)
1269            .map_err(|err| struct_error_name(err, struct_variant))
1270    }
1271}
1272
1273fn struct_error_name(error: Error, name: Option<&str>) -> Error {
1274    match error {
1275        Error::NoSuchStructField {
1276            expected,
1277            found,
1278            outer: None,
1279        } => Error::NoSuchStructField {
1280            expected,
1281            found,
1282            outer: name.map(ToOwned::to_owned),
1283        },
1284        Error::MissingStructField { field, outer: None } => Error::MissingStructField {
1285            field,
1286            outer: name.map(ToOwned::to_owned),
1287        },
1288        Error::DuplicateStructField { field, outer: None } => Error::DuplicateStructField {
1289            field,
1290            outer: name.map(ToOwned::to_owned),
1291        },
1292        e => e,
1293    }
1294}
1295
1296struct SerdeEnumContent<'a, 'de: 'a> {
1297    de: &'a mut Deserializer<'de>,
1298    ident: Option<&'a str>,
1299}
1300
1301impl<'de, 'a> de::MapAccess<'de> for SerdeEnumContent<'a, 'de> {
1302    type Error = Error;
1303
1304    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
1305    where
1306        K: DeserializeSeed<'de>,
1307    {
1308        self.ident
1309            .take()
1310            .map(|ident| seed.deserialize(de::value::StrDeserializer::new(ident)))
1311            .transpose()
1312    }
1313
1314    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
1315    where
1316        V: DeserializeSeed<'de>,
1317    {
1318        self.de.parser.skip_ws()?;
1319
1320        let old_serde_content_newtype = self.de.serde_content_newtype;
1321        self.de.serde_content_newtype = true;
1322        let result = seed.deserialize(&mut *self.de);
1323        self.de.serde_content_newtype = old_serde_content_newtype;
1324
1325        result
1326    }
1327}
1328
1329fn is_serde_content<T>() -> bool {
1330    #[derive(serde_derive::Deserialize)]
1331    enum A {}
1332    type B = A;
1333
1334    #[derive(serde_derive::Deserialize)]
1335    #[serde(untagged)]
1336    enum UntaggedEnum {
1337        A(A),
1338        B(B),
1339    }
1340
1341    struct TypeIdDeserializer;
1342
1343    impl<'de> de::Deserializer<'de> for TypeIdDeserializer {
1344        type Error = TypeIdError;
1345
1346        fn deserialize_any<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value, Self::Error> {
1347            Err(TypeIdError(typeid::of::<V::Value>()))
1348        }
1349
1350        serde::forward_to_deserialize_any! {
1351            bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
1352            bytes byte_buf option unit unit_struct newtype_struct seq tuple
1353            tuple_struct map struct enum identifier ignored_any
1354        }
1355    }
1356
1357    #[derive(Debug)]
1358    struct TypeIdError(core::any::TypeId);
1359
1360    impl core::fmt::Display for TypeIdError {
1361        fn fmt(&self, _fmt: &mut core::fmt::Formatter) -> core::fmt::Result {
1362            Ok(())
1363        }
1364    }
1365
1366    impl de::Error for TypeIdError {
1367        #[allow(clippy::unreachable)]
1368        fn custom<T: core::fmt::Display>(_msg: T) -> Self {
1369            unreachable!()
1370        }
1371    }
1372
1373    impl de::StdError for TypeIdError {}
1374
1375    fn type_id_of_untagged_enum_default_buffer() -> core::any::TypeId {
1376        static TYPE_ID: once_cell::race::OnceBox<core::any::TypeId> =
1377            once_cell::race::OnceBox::new();
1378
1379        *TYPE_ID.get_or_init(|| match Deserialize::deserialize(TypeIdDeserializer) {
1380            Ok(UntaggedEnum::A(void) | UntaggedEnum::B(void)) => match void {},
1381            Err(TypeIdError(typeid)) => alloc::boxed::Box::new(typeid),
1382        })
1383    }
1384
1385    typeid::of::<T>() == type_id_of_untagged_enum_default_buffer()
1386}
1387
1388fn is_serde_tag_or_content<T>() -> bool {
1389    #[derive(serde_derive::Deserialize)]
1390    enum A {}
1391
1392    #[derive(serde_derive::Deserialize)]
1393    #[serde(tag = "tag")]
1394    enum InternallyTaggedEnum {
1395        A { a: A },
1396    }
1397
1398    struct TypeIdDeserializer;
1399
1400    impl<'de> de::Deserializer<'de> for TypeIdDeserializer {
1401        type Error = TypeIdError;
1402
1403        fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1404        where
1405            V: Visitor<'de>,
1406        {
1407            visitor.visit_map(self)
1408        }
1409
1410        serde::forward_to_deserialize_any! {
1411            bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
1412            bytes byte_buf option unit unit_struct newtype_struct seq tuple
1413            tuple_struct map struct enum identifier ignored_any
1414        }
1415    }
1416
1417    impl<'de> de::MapAccess<'de> for TypeIdDeserializer {
1418        type Error = TypeIdError;
1419
1420        fn next_key_seed<K: DeserializeSeed<'de>>(
1421            &mut self,
1422            _seed: K,
1423        ) -> Result<Option<K::Value>, Self::Error> {
1424            Err(TypeIdError(typeid::of::<K::Value>()))
1425        }
1426
1427        #[allow(clippy::unreachable)]
1428        fn next_value_seed<V: DeserializeSeed<'de>>(
1429            &mut self,
1430            _seed: V,
1431        ) -> Result<V::Value, Self::Error> {
1432            unreachable!()
1433        }
1434    }
1435
1436    #[derive(Debug)]
1437    struct TypeIdError(core::any::TypeId);
1438
1439    impl core::fmt::Display for TypeIdError {
1440        fn fmt(&self, _fmt: &mut core::fmt::Formatter) -> core::fmt::Result {
1441            Ok(())
1442        }
1443    }
1444
1445    impl de::Error for TypeIdError {
1446        #[allow(clippy::unreachable)]
1447        fn custom<T: core::fmt::Display>(_msg: T) -> Self {
1448            unreachable!()
1449        }
1450    }
1451
1452    impl de::StdError for TypeIdError {}
1453
1454    fn type_id_of_internally_tagged_enum_default_tag_or_buffer() -> core::any::TypeId {
1455        static TYPE_ID: once_cell::race::OnceBox<core::any::TypeId> =
1456            once_cell::race::OnceBox::new();
1457
1458        *TYPE_ID.get_or_init(|| match Deserialize::deserialize(TypeIdDeserializer) {
1459            Ok(InternallyTaggedEnum::A { a: void }) => match void {},
1460            Err(TypeIdError(typeid)) => alloc::boxed::Box::new(typeid),
1461        })
1462    }
1463
1464    typeid::of::<T>() == type_id_of_internally_tagged_enum_default_tag_or_buffer()
1465}