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