1
/// Deserialization module.
2
use alloc::{
3
    borrow::ToOwned,
4
    string::{String, ToString},
5
    vec::Vec,
6
};
7
use core::str;
8

            
9
use serde::{
10
    de::{self, DeserializeSeed, Deserializer as _, Visitor},
11
    Deserialize,
12
};
13

            
14
pub use crate::error::{Error, Position, Span, SpannedError};
15
use 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")]
23
use std::io;
24

            
25
mod id;
26
mod tag;
27
#[cfg(test)]
28
mod tests;
29
mod 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.
35
pub 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

            
43
impl<'de> Deserializer<'de> {
44
    // Cannot implement trait here since output is tied to input lifetime 'de.
45
    #[allow(clippy::should_implement_trait)]
46
22334
    pub fn from_str(input: &'de str) -> SpannedResult<Self> {
47
22334
        Self::from_str_with_options(input, &Options::default())
48
22334
    }
49

            
50
282
    pub fn from_bytes(input: &'de [u8]) -> SpannedResult<Self> {
51
282
        Self::from_bytes_with_options(input, &Options::default())
52
282
    }
53

            
54
547263
    pub fn from_str_with_options(input: &'de str, options: &Options) -> SpannedResult<Self> {
55
546444
        let mut deserializer = Deserializer {
56
547263
            parser: Parser::new(input)?,
57
            newtype_variant: false,
58
            serde_content_newtype: false,
59
546444
            last_identifier: None,
60
546444
            recursion_limit: options.recursion_limit,
61
        };
62

            
63
546444
        deserializer.parser.exts |= options.default_extensions;
64

            
65
546444
        Ok(deserializer)
66
547263
    }
67

            
68
    // FIXME: panic is not actually possible, remove once utf8_chunks is stabilized
69
    #[allow(clippy::missing_panics_doc)]
70
4452
    pub fn from_bytes_with_options(input: &'de [u8], options: &Options) -> SpannedResult<Self> {
71
4452
        let err = match str::from_utf8(input) {
72
3888
            Ok(input) => return Self::from_str_with_options(input, options),
73
564
            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
564
        let valid_input =
79
564
            str::from_utf8(&input[..err.valid_up_to()]).expect("source is valid up to error");
80

            
81
564
        Err(SpannedError {
82
564
            code: err.into(),
83
564
            span: Span {
84
564
                start: Position { line: 1, col: 1 },
85
564
                end: Position::from_src_end(valid_input),
86
564
            },
87
564
        })
88
4452
    }
89

            
90
    #[must_use]
91
8
    pub fn remainder(&self) -> &'de str {
92
8
        self.parser.src()
93
8
    }
94

            
95
    #[must_use]
96
104168
    pub fn span_error(&self, code: Error) -> SpannedError {
97
104168
        self.parser.span_error(code)
98
104168
    }
99

            
100
    #[must_use]
101
9870
    pub fn extensions(&self) -> Extensions {
102
9870
        self.parser.exts
103
9870
    }
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")]
109
336
pub fn from_reader<R, T>(rdr: R) -> SpannedResult<T>
110
336
where
111
336
    R: io::Read,
112
336
    T: de::DeserializeOwned,
113
{
114
336
    Options::default().from_reader(rdr)
115
336
}
116

            
117
/// A convenience function for building a deserializer
118
/// and deserializing a value of type `T` from a string.
119
7706
pub fn from_str<'a, T>(s: &'a str) -> SpannedResult<T>
120
7706
where
121
7706
    T: de::Deserialize<'a>,
122
{
123
7706
    Options::default().from_str(s)
124
7706
}
125

            
126
/// A convenience function for building a deserializer
127
/// and deserializing a value of type `T` from bytes.
128
352
pub fn from_bytes<'a, T>(s: &'a [u8]) -> SpannedResult<T>
129
352
where
130
352
    T: de::Deserialize<'a>,
131
{
132
352
    Options::default().from_bytes(s)
133
352
}
134

            
135
macro_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

            
155
impl<'de> Deserializer<'de> {
156
    /// Check if the remaining bytes are whitespace only,
157
    /// otherwise return an error.
158
440870
    pub fn end(&mut self) -> Result<()> {
159
440870
        self.parser.skip_ws()?;
160

            
161
440306
        if self.parser.src().is_empty() {
162
434658
            Ok(())
163
        } else {
164
5648
            Err(Error::TrailingCharacters)
165
        }
166
440870
    }
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
21460
    fn handle_any_struct<V>(&mut self, visitor: V, ident: Option<&str>) -> Result<V::Value>
174
21460
    where
175
21460
        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/issues/1183
179
21460
        let is_serde_content =
180
21460
            is_serde_content::<V::Value>() || is_serde_tag_or_content::<V::Value>();
181

            
182
21460
        let old_serde_content_newtype = self.serde_content_newtype;
183
21460
        self.serde_content_newtype = false;
184

            
185
        match (
186
21460
            self.parser.check_struct_type(
187
21460
                NewtypeMode::NoParensMeanUnit,
188
21460
                if old_serde_content_newtype {
189
131
                    TupleMode::DifferentiateNewtype // separate match on NewtypeOrTuple below
190
                } else {
191
21329
                    TupleMode::ImpreciseTupleOrNewtype // Tuple and NewtypeOrTuple match equally
192
                },
193
19
            )?,
194
21441
            ident,
195
        ) {
196
52
            (StructType::Unit, Some(ident)) if is_serde_content => {
197
                // serde's Content type needs the ident for unit variants
198
52
                visitor.visit_str(ident)
199
            }
200
8746
            (StructType::Unit, _) => visitor.visit_unit(),
201
139
            (_, Some(ident)) if is_serde_content => {
202
                // serde's Content type uses a singleton map encoding for enums
203
139
                visitor.visit_map(SerdeEnumContent {
204
139
                    de: self,
205
139
                    ident: Some(ident),
206
139
                })
207
            }
208
            (StructType::Named, _) => {
209
                // giving no name results in worse errors but is necessary here
210
3896
                self.handle_struct_after_name("", visitor)
211
            }
212
68
            (StructType::NewtypeTuple, _) if old_serde_content_newtype => {
213
                // deserialize a newtype struct or variant
214
68
                self.parser.consume_char('(');
215
68
                self.parser.skip_ws()?;
216
68
                let result = self.deserialize_any(visitor);
217
68
                self.parser.skip_ws()?;
218
68
                self.parser.consume_char(')');
219

            
220
68
                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
8540
                self.deserialize_tuple(0, visitor)
231
            }
232
        }
233
21460
    }
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
5186
    fn handle_struct_after_name<V>(
243
5186
        &mut self,
244
5186
        name_for_pretty_errors_only: &'static str,
245
5186
        visitor: V,
246
5186
    ) -> Result<V::Value>
247
5186
    where
248
5186
        V: Visitor<'de>,
249
    {
250
5186
        if self.newtype_variant || self.parser.consume_char('(') {
251
5166
            let old_newtype_variant = self.newtype_variant;
252
5166
            self.newtype_variant = false;
253

            
254
5166
            let value = guard_recursion! { self =>
255
5166
                visitor
256
5166
                    .visit_map(CommaSeparated::new(Terminator::Struct, self))
257
5166
                    .map_err(|err| {
258
904
                        struct_error_name(
259
904
                            err,
260
904
                            if !old_newtype_variant && !name_for_pretty_errors_only.is_empty() {
261
238
                                Some(name_for_pretty_errors_only)
262
                            } else {
263
666
                                None
264
                            },
265
                        )
266
904
                    })?
267
            };
268

            
269
4262
            self.parser.skip_ws()?;
270

            
271
4262
            if old_newtype_variant || self.parser.consume_char(')') {
272
4250
                Ok(value)
273
            } else {
274
12
                Err(Error::ExpectedStructLikeEnd)
275
            }
276
20
        } else if name_for_pretty_errors_only.is_empty() {
277
4
            Err(Error::ExpectedStructLike)
278
        } else {
279
16
            Err(Error::ExpectedNamedStructLike(name_for_pretty_errors_only))
280
        }
281
5186
    }
282
}
283

            
284
impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
285
    type Error = Error;
286

            
287
401293
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
288
401293
    where
289
401293
        V: Visitor<'de>,
290
    {
291
401293
        if self.newtype_variant {
292
2260
            if self.parser.check_char(')') {
293
                // newtype variant wraps the unit type / a unit struct without name
294
282
                return self.deserialize_unit(visitor);
295
1978
            }
296

            
297
            #[allow(clippy::wildcard_in_or_patterns)]
298
1978
            match self
299
1978
                .parser
300
1978
                .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
282
                    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
282
                    return self.deserialize_tuple(0, visitor);
311
                }
312
                // StructType::Unit is impossible with NewtypeMode::InsideNewtype
313
                // StructType::AnyTuple is impossible with TupleMode::DifferentiateNewtype
314
1414
                StructType::NewtypeTuple | _ => {
315
1414
                    // continue as usual with the inner content of the newtype variant
316
1414
                    self.newtype_variant = false;
317
1414
                }
318
            }
319
399033
        }
320

            
321
400447
        if self.parser.consume_ident("true") {
322
1465
            return visitor.visit_bool(true);
323
398982
        } else if self.parser.consume_ident("false") {
324
1425
            return visitor.visit_bool(false);
325
397557
        } else if self.parser.check_ident("Some") {
326
4028
            return self.deserialize_option(visitor);
327
393529
        } else if self.parser.consume_ident("None") {
328
7622
            return visitor.visit_none();
329
385907
        } else if self.parser.consume_str("()") {
330
664
            return visitor.visit_unit();
331
385243
        } else if self.parser.consume_ident("inf") || self.parser.consume_ident("inff32") {
332
854
            return visitor.visit_f32(core::f32::INFINITY);
333
384389
        } else if self.parser.consume_ident("inff64") {
334
564
            return visitor.visit_f64(core::f64::INFINITY);
335
383825
        } else if self.parser.consume_ident("NaN") || self.parser.consume_ident("NaNf32") {
336
854
            return visitor.visit_f32(core::f32::NAN);
337
382971
        } else if self.parser.consume_ident("NaNf64") {
338
564
            return visitor.visit_f64(core::f64::NAN);
339
382407
        }
340

            
341
        // `skip_identifier` does not change state if it fails
342
382407
        if let Some(ident) = self.parser.skip_identifier() {
343
11213
            self.parser.skip_ws()?;
344

            
345
11213
            return self.handle_any_struct(visitor, Some(ident));
346
371194
        }
347

            
348
371194
        match self.parser.peek_char_or_eof()? {
349
10247
            '(' => self.handle_any_struct(visitor, None),
350
1714
            '[' => self.deserialize_seq(visitor),
351
75046
            '{' => self.deserialize_map(visitor),
352
54981
            '0'..='9' | '+' | '-' | '.' => self.parser.any_number()?.visit(visitor),
353
5814
            '"' | 'r' => self.deserialize_string(visitor),
354
219694
            'b' if self.parser.src().starts_with("b'") => self.parser.any_number()?.visit(visitor),
355
2272
            'b' => self.deserialize_byte_buf(visitor),
356
1724
            '\'' => self.deserialize_char(visitor),
357
846
            other => Err(Error::UnexpectedChar(other)),
358
        }
359
401293
    }
360

            
361
576
    fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
362
576
    where
363
576
        V: Visitor<'de>,
364
    {
365
576
        visitor.visit_bool(self.parser.bool()?)
366
576
    }
367

            
368
92
    fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value>
369
92
    where
370
92
        V: Visitor<'de>,
371
    {
372
92
        visitor.visit_i8(self.parser.integer()?)
373
92
    }
374

            
375
52
    fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value>
376
52
    where
377
52
        V: Visitor<'de>,
378
    {
379
52
        visitor.visit_i16(self.parser.integer()?)
380
52
    }
381

            
382
1143
    fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value>
383
1143
    where
384
1143
        V: Visitor<'de>,
385
    {
386
1143
        visitor.visit_i32(self.parser.integer()?)
387
1143
    }
388

            
389
118
    fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value>
390
118
    where
391
118
        V: Visitor<'de>,
392
    {
393
118
        visitor.visit_i64(self.parser.integer()?)
394
118
    }
395

            
396
    #[cfg(feature = "integer128")]
397
32
    fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value>
398
32
    where
399
32
        V: Visitor<'de>,
400
    {
401
32
        visitor.visit_i128(self.parser.integer()?)
402
32
    }
403

            
404
20090
    fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value>
405
20090
    where
406
20090
        V: Visitor<'de>,
407
    {
408
20090
        visitor.visit_u8(self.parser.integer()?)
409
20090
    }
410

            
411
56
    fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value>
412
56
    where
413
56
        V: Visitor<'de>,
414
    {
415
56
        visitor.visit_u16(self.parser.integer()?)
416
56
    }
417

            
418
505
    fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value>
419
505
    where
420
505
        V: Visitor<'de>,
421
    {
422
505
        visitor.visit_u32(self.parser.integer()?)
423
505
    }
424

            
425
58
    fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value>
426
58
    where
427
58
        V: Visitor<'de>,
428
    {
429
58
        visitor.visit_u64(self.parser.integer()?)
430
58
    }
431

            
432
    #[cfg(feature = "integer128")]
433
38
    fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value>
434
38
    where
435
38
        V: Visitor<'de>,
436
    {
437
38
        visitor.visit_u128(self.parser.integer()?)
438
38
    }
439

            
440
613
    fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value>
441
613
    where
442
613
        V: Visitor<'de>,
443
    {
444
613
        visitor.visit_f32(self.parser.float()?)
445
613
    }
446

            
447
248
    fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value>
448
248
    where
449
248
        V: Visitor<'de>,
450
    {
451
248
        visitor.visit_f64(self.parser.float()?)
452
248
    }
453

            
454
2442
    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
455
2442
    where
456
2442
        V: Visitor<'de>,
457
    {
458
2442
        visitor.visit_char(self.parser.char()?)
459
2442
    }
460

            
461
7106
    fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
462
7106
    where
463
7106
        V: Visitor<'de>,
464
    {
465
7106
        match self.parser.string()? {
466
104
            ParsedStr::Allocated(s) => visitor.visit_string(s),
467
6911
            ParsedStr::Slice(s) => visitor.visit_borrowed_str(s),
468
        }
469
7106
    }
470

            
471
6233
    fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
472
6233
    where
473
6233
        V: Visitor<'de>,
474
    {
475
6233
        self.deserialize_str(visitor)
476
6233
    }
477

            
478
20
    fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
479
20
    where
480
20
        V: Visitor<'de>,
481
    {
482
20
        self.deserialize_byte_buf(visitor)
483
20
    }
484

            
485
2400
    fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
486
2400
    where
487
2400
        V: Visitor<'de>,
488
    {
489
2400
        if self.parser.check_char('[') {
490
4
            let bytes = Vec::<u8>::deserialize(self)?;
491
4
            return visitor.visit_byte_buf(bytes);
492
2396
        }
493

            
494
2396
        match self.parser.byte_string()? {
495
612
            ParsedByteStr::Allocated(byte_buf) => visitor.visit_byte_buf(byte_buf),
496
1748
            ParsedByteStr::Slice(bytes) => visitor.visit_borrowed_bytes(bytes),
497
        }
498
2400
    }
499

            
500
4488
    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
501
4488
    where
502
4488
        V: Visitor<'de>,
503
    {
504
4488
        if self.parser.consume_ident("None") {
505
112
            visitor.visit_none()
506
4376
        } else if self.parser.consume_ident("Some") && {
507
4208
            self.parser.skip_ws()?;
508
4208
            self.parser.consume_char('(')
509
        } {
510
4208
            self.parser.skip_ws()?;
511

            
512
4208
            self.newtype_variant = self
513
4208
                .parser
514
4208
                .exts
515
4208
                .contains(Extensions::UNWRAP_VARIANT_NEWTYPES);
516

            
517
4208
            let v = guard_recursion! { self => visitor.visit_some(&mut *self)? };
518

            
519
4204
            self.newtype_variant = false;
520

            
521
4204
            self.parser.comma()?;
522

            
523
4204
            if self.parser.consume_char(')') {
524
3918
                Ok(v)
525
            } else {
526
286
                Err(Error::ExpectedOptionEnd)
527
            }
528
168
        } else if self.parser.exts.contains(Extensions::IMPLICIT_SOME) {
529
164
            guard_recursion! { self => visitor.visit_some(&mut *self) }
530
        } else {
531
4
            Err(Error::ExpectedOption)
532
        }
533
4488
    }
534

            
535
    // In Serde, unit means an anonymous value containing no data.
536
442
    fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
537
442
    where
538
442
        V: Visitor<'de>,
539
    {
540
442
        if self.newtype_variant || self.parser.consume_str("()") {
541
438
            self.newtype_variant = false;
542

            
543
438
            visitor.visit_unit()
544
        } else {
545
4
            Err(Error::ExpectedUnit)
546
        }
547
442
    }
548

            
549
160
    fn deserialize_unit_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
550
160
    where
551
160
        V: Visitor<'de>,
552
    {
553
160
        if self.newtype_variant || self.parser.consume_struct_name(name)? {
554
56
            self.newtype_variant = false;
555

            
556
56
            visitor.visit_unit()
557
        } else {
558
84
            self.deserialize_unit(visitor)
559
        }
560
160
    }
561

            
562
13760
    fn deserialize_newtype_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
563
13760
    where
564
13760
        V: Visitor<'de>,
565
    {
566
13760
        if name == crate::value::raw::RAW_VALUE_TOKEN {
567
13334
            let src_before = self.parser.pre_ws_src();
568
13334
            self.parser.skip_ws()?;
569
13334
            let _ignored = self.deserialize_ignored_any(de::IgnoredAny)?;
570
12488
            self.parser.skip_ws()?;
571
12488
            let src_after = self.parser.src();
572

            
573
12488
            if self.parser.has_unclosed_line_comment() {
574
1128
                return Err(Error::UnclosedLineComment);
575
11360
            }
576

            
577
11360
            let ron_str = &src_before[..src_before.len() - src_after.len()];
578

            
579
11360
            return visitor
580
11360
                .visit_borrowed_str::<Error>(ron_str)
581
11360
                .map_err(|_| Error::ExpectedRawValue);
582
426
        }
583

            
584
426
        if self.parser.exts.contains(Extensions::UNWRAP_NEWTYPES) || self.newtype_variant {
585
108
            self.newtype_variant = false;
586

            
587
108
            return guard_recursion! { self => visitor.visit_newtype_struct(&mut *self) };
588
318
        }
589

            
590
318
        self.parser.consume_struct_name(name)?;
591

            
592
291
        self.parser.skip_ws()?;
593

            
594
291
        if self.parser.consume_char('(') {
595
264
            self.parser.skip_ws()?;
596
264
            let value = guard_recursion! { self => visitor.visit_newtype_struct(&mut *self)? };
597
264
            self.parser.comma()?;
598

            
599
264
            if self.parser.consume_char(')') {
600
260
                Ok(value)
601
            } else {
602
4
                Err(Error::ExpectedStructLikeEnd)
603
            }
604
27
        } else if name.is_empty() {
605
12
            Err(Error::ExpectedStructLike)
606
        } else {
607
15
            Err(Error::ExpectedNamedStructLike(name))
608
        }
609
13760
    }
610

            
611
5278
    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
612
5278
    where
613
5278
        V: Visitor<'de>,
614
    {
615
5278
        self.newtype_variant = false;
616

            
617
5278
        if self.parser.consume_char('[') {
618
5266
            let value = guard_recursion! { self =>
619
5266
                visitor.visit_seq(CommaSeparated::new(Terminator::Seq, self))?
620
            };
621
4976
            self.parser.skip_ws()?;
622

            
623
4976
            if self.parser.consume_char(']') {
624
4964
                Ok(value)
625
            } else {
626
12
                Err(Error::ExpectedArrayEnd)
627
            }
628
        } else {
629
12
            Err(Error::ExpectedArray)
630
        }
631
5278
    }
632

            
633
9304
    fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
634
9304
    where
635
9304
        V: Visitor<'de>,
636
    {
637
9304
        if self.newtype_variant || self.parser.consume_char('(') {
638
9248
            let old_newtype_variant = self.newtype_variant;
639
9248
            self.newtype_variant = false;
640

            
641
9248
            let value = guard_recursion! { self =>
642
9248
                visitor.visit_seq(CommaSeparated::new(Terminator::Tuple, self))?
643
            };
644
8360
            self.parser.skip_ws()?;
645

            
646
8360
            if old_newtype_variant || self.parser.consume_char(')') {
647
8348
                Ok(value)
648
            } else {
649
12
                Err(Error::ExpectedStructLikeEnd)
650
            }
651
        } else {
652
56
            Err(Error::ExpectedStructLike)
653
        }
654
9304
    }
655

            
656
223
    fn deserialize_tuple_struct<V>(
657
223
        self,
658
223
        name: &'static str,
659
223
        len: usize,
660
223
        visitor: V,
661
223
    ) -> Result<V::Value>
662
223
    where
663
223
        V: Visitor<'de>,
664
    {
665
223
        if !self.newtype_variant {
666
207
            self.parser.consume_struct_name(name)?;
667
16
        }
668

            
669
196
        self.deserialize_tuple(len, visitor).map_err(|e| match e {
670
24
            Error::ExpectedStructLike if !name.is_empty() => Error::ExpectedNamedStructLike(name),
671
24
            e => e,
672
36
        })
673
223
    }
674

            
675
75466
    fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
676
75466
    where
677
75466
        V: Visitor<'de>,
678
    {
679
        struct VisitorExpecting<V>(V);
680
        impl<'de, V: Visitor<'de>> core::fmt::Display for VisitorExpecting<&'_ V> {
681
75466
            fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result {
682
75466
                self.0.expecting(fmt)
683
75466
            }
684
        }
685

            
686
75466
        self.newtype_variant = false;
687

            
688
        // TODO: Avoid allocating to perform this check.
689
75466
        let serde_flatten_canary = VisitorExpecting(&visitor)
690
75466
            .to_string()
691
75466
            .starts_with("struct ");
692

            
693
75466
        let terminator = if serde_flatten_canary {
694
276
            Terminator::MapAsStruct
695
        } else {
696
75190
            Terminator::Map
697
        };
698

            
699
75466
        if self.parser.consume_char('{') {
700
75454
            let value = guard_recursion! { self =>
701
74326
                visitor.visit_map(CommaSeparated::new(terminator, self))?
702
            };
703
2506
            self.parser.skip_ws()?;
704

            
705
2506
            if self.parser.consume_char('}') {
706
2494
                Ok(value)
707
            } else {
708
12
                Err(Error::ExpectedMapEnd)
709
            }
710
        } else {
711
12
            Err(Error::ExpectedMap)
712
        }
713
75466
    }
714

            
715
915
    fn deserialize_struct<V>(
716
915
        self,
717
915
        name: &'static str,
718
915
        _fields: &'static [&'static str],
719
915
        visitor: V,
720
915
    ) -> Result<V::Value>
721
915
    where
722
915
        V: Visitor<'de>,
723
    {
724
915
        if !self.newtype_variant {
725
850
            self.parser.consume_struct_name(name)?;
726
65
        }
727

            
728
879
        self.parser.skip_ws()?;
729

            
730
879
        self.handle_struct_after_name(name, visitor)
731
915
    }
732

            
733
1049
    fn deserialize_enum<V>(
734
1049
        self,
735
1049
        name: &'static str,
736
1049
        _variants: &'static [&'static str],
737
1049
        visitor: V,
738
1049
    ) -> Result<V::Value>
739
1049
    where
740
1049
        V: Visitor<'de>,
741
    {
742
1049
        self.newtype_variant = false;
743

            
744
1049
        match guard_recursion! { self => visitor.visit_enum(Enum::new(self)) } {
745
784
            Ok(value) => Ok(value),
746
            Err(Error::NoSuchEnumVariant {
747
18
                expected,
748
18
                found,
749
                outer: None,
750
18
            }) if !name.is_empty() => Err(Error::NoSuchEnumVariant {
751
18
                expected,
752
18
                found,
753
18
                outer: Some(String::from(name)),
754
18
            }),
755
247
            Err(e) => Err(e),
756
        }
757
1049
    }
758

            
759
9229
    fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
760
9229
    where
761
9229
        V: Visitor<'de>,
762
    {
763
9229
        let identifier = self.parser.identifier()?;
764

            
765
9161
        self.last_identifier = Some(identifier);
766

            
767
9161
        visitor.visit_borrowed_str(identifier)
768
9229
    }
769

            
770
55836
    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
771
55836
    where
772
55836
        V: Visitor<'de>,
773
    {
774
55836
        self.deserialize_any(visitor)
775
55836
    }
776
}
777

            
778
enum Terminator {
779
    Map,
780
    MapAsStruct,
781
    Tuple,
782
    Struct,
783
    Seq,
784
}
785

            
786
impl Terminator {
787
550614
    fn as_char(&self) -> char {
788
550614
        match self {
789
162514
            Terminator::Map | Terminator::MapAsStruct => '}',
790
348958
            Terminator::Tuple | Terminator::Struct => ')',
791
39142
            Terminator::Seq => ']',
792
        }
793
550614
    }
794
}
795

            
796
struct 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

            
803
impl<'a, 'de> CommaSeparated<'a, 'de> {
804
250195
    fn new(terminator: Terminator, de: &'a mut Deserializer<'de>) -> Self {
805
250195
        CommaSeparated {
806
250195
            de,
807
250195
            terminator,
808
250195
            had_comma: true,
809
250195
            inside_internally_tagged_enum: false,
810
250195
        }
811
250195
    }
812

            
813
550614
    fn has_element(&mut self) -> Result<bool> {
814
550614
        self.de.parser.skip_ws()?;
815

            
816
550614
        match (
817
550614
            self.had_comma,
818
550614
            !self.de.parser.check_char(self.terminator.as_char()),
819
550614
        ) {
820
            // Trailing comma, maybe has a next element
821
483941
            (true, has_element) => Ok(has_element),
822
            // No trailing comma but terminator
823
65545
            (false, false) => Ok(false),
824
            // No trailing comma or terminator
825
1128
            (false, true) => Err(Error::ExpectedComma),
826
        }
827
550614
    }
828
}
829

            
830
impl<'de, 'a> de::SeqAccess<'de> for CommaSeparated<'a, 'de> {
831
    type Error = Error;
832

            
833
40204
    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
834
40204
    where
835
40204
        T: DeserializeSeed<'de>,
836
    {
837
40204
        if self.has_element()? {
838
27253
            let res = guard_recursion! { self.de => seed.deserialize(&mut *self.de)? };
839

            
840
26090
            self.had_comma = self.de.parser.comma()?;
841

            
842
26090
            Ok(Some(res))
843
        } else {
844
12943
            Ok(None)
845
        }
846
40204
    }
847
}
848

            
849
impl<'de, 'a> de::MapAccess<'de> for CommaSeparated<'a, 'de> {
850
    type Error = Error;
851

            
852
90005
    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
853
90005
    where
854
90005
        K: DeserializeSeed<'de>,
855
    {
856
90005
        if self.has_element()? {
857
83096
            self.inside_internally_tagged_enum = is_serde_tag_or_content::<K::Value>();
858

            
859
83096
            match self.terminator {
860
8280
                Terminator::Struct => guard_recursion! { self.de =>
861
8280
                    seed.deserialize(&mut id::Deserializer::new(&mut *self.de, false)).map(Some)
862
                },
863
612
                Terminator::MapAsStruct => guard_recursion! { self.de =>
864
612
                    seed.deserialize(&mut id::Deserializer::new(&mut *self.de, true)).map(Some)
865
                },
866
74204
                _ => guard_recursion! { self.de => seed.deserialize(&mut *self.de).map(Some) },
867
            }
868
        } else {
869
6901
            Ok(None)
870
        }
871
90005
    }
872

            
873
12050
    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
874
12050
    where
875
12050
        V: DeserializeSeed<'de>,
876
    {
877
12050
        self.de.parser.skip_ws()?;
878

            
879
12050
        if self.de.parser.consume_char(':') {
880
11760
            self.de.parser.skip_ws()?;
881

            
882
11760
            let res = if self.inside_internally_tagged_enum && !is_serde_content::<V::Value>() {
883
101
                guard_recursion! { self.de =>
884
101
                    seed.deserialize(&mut tag::Deserializer::new(&mut *self.de))?
885
                }
886
            } else {
887
11659
                guard_recursion! { self.de =>
888
11659
                    seed.deserialize(&mut *self.de)?
889
                }
890
            };
891

            
892
11121
            self.had_comma = self.de.parser.comma()?;
893

            
894
11121
            Ok(res)
895
        } else {
896
290
            Err(Error::ExpectedMapColon)
897
        }
898
12050
    }
899
}
900

            
901
struct Enum<'a, 'de: 'a> {
902
    de: &'a mut Deserializer<'de>,
903
}
904

            
905
impl<'a, 'de> Enum<'a, 'de> {
906
66468
    fn new(de: &'a mut Deserializer<'de>) -> Self {
907
66468
        Enum { de }
908
66468
    }
909
}
910

            
911
impl<'de, 'a> de::EnumAccess<'de> for Enum<'a, 'de> {
912
    type Error = Error;
913
    type Variant = Self;
914

            
915
1049
    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)>
916
1049
    where
917
1049
        V: DeserializeSeed<'de>,
918
    {
919
1049
        self.de.parser.skip_ws()?;
920

            
921
1049
        let value = guard_recursion! { self.de => seed.deserialize(&mut *self.de)? };
922

            
923
1011
        Ok((value, self))
924
1049
    }
925
}
926

            
927
impl<'de, 'a> de::VariantAccess<'de> for Enum<'a, 'de> {
928
    type Error = Error;
929

            
930
16392
    fn unit_variant(self) -> Result<()> {
931
16392
        Ok(())
932
16392
    }
933

            
934
515
    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
935
515
    where
936
515
        T: DeserializeSeed<'de>,
937
    {
938
515
        let newtype_variant = self.de.last_identifier;
939

            
940
515
        self.de.parser.skip_ws()?;
941

            
942
515
        if self.de.parser.consume_char('(') {
943
503
            self.de.parser.skip_ws()?;
944

            
945
503
            self.de.newtype_variant = self
946
503
                .de
947
503
                .parser
948
503
                .exts
949
503
                .contains(Extensions::UNWRAP_VARIANT_NEWTYPES);
950

            
951
503
            let val = guard_recursion! { self.de =>
952
503
                seed
953
503
                    .deserialize(&mut *self.de)
954
503
                    .map_err(|err| struct_error_name(err, newtype_variant))?
955
            };
956

            
957
372
            self.de.newtype_variant = false;
958

            
959
372
            self.de.parser.comma()?;
960

            
961
372
            if self.de.parser.consume_char(')') {
962
360
                Ok(val)
963
            } else {
964
12
                Err(Error::ExpectedStructLikeEnd)
965
            }
966
        } else {
967
12
            Err(Error::ExpectedStructLike)
968
        }
969
515
    }
970

            
971
99
    fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value>
972
99
    where
973
99
        V: Visitor<'de>,
974
    {
975
99
        self.de.parser.skip_ws()?;
976

            
977
99
        self.de.deserialize_tuple(len, visitor)
978
99
    }
979

            
980
129
    fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value>
981
129
    where
982
129
        V: Visitor<'de>,
983
    {
984
129
        let struct_variant = self.de.last_identifier;
985

            
986
129
        self.de.parser.skip_ws()?;
987

            
988
129
        self.de
989
129
            .handle_struct_after_name("", visitor)
990
129
            .map_err(|err| struct_error_name(err, struct_variant))
991
129
    }
992
}
993

            
994
35736
fn struct_error_name(error: Error, name: Option<&str>) -> Error {
995
3747
    match error {
996
        Error::NoSuchStructField {
997
3747
            expected,
998
3747
            found,
999
            outer: None,
3747
        } => Error::NoSuchStructField {
3747
            expected,
3747
            found,
3747
            outer: name.map(ToOwned::to_owned),
3747
        },
4380
        Error::MissingStructField { field, outer: None } => Error::MissingStructField {
4380
            field,
4380
            outer: name.map(ToOwned::to_owned),
4380
        },
3747
        Error::DuplicateStructField { field, outer: None } => Error::DuplicateStructField {
3747
            field,
3747
            outer: name.map(ToOwned::to_owned),
3747
        },
23862
        e => e,
    }
35736
}
struct SerdeEnumContent<'a, 'de: 'a> {
    de: &'a mut Deserializer<'de>,
    ident: Option<&'a str>,
}
impl<'de, 'a> de::MapAccess<'de> for SerdeEnumContent<'a, 'de> {
    type Error = Error;
263
    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
263
    where
263
        K: DeserializeSeed<'de>,
    {
263
        self.ident
263
            .take()
263
            .map(|ident| seed.deserialize(de::value::StrDeserializer::new(ident)))
263
            .transpose()
263
    }
139
    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
139
    where
139
        V: DeserializeSeed<'de>,
    {
139
        self.de.parser.skip_ws()?;
139
        let old_serde_content_newtype = self.de.serde_content_newtype;
139
        self.de.serde_content_newtype = true;
139
        let result = seed.deserialize(&mut *self.de);
139
        self.de.serde_content_newtype = old_serde_content_newtype;
139
        result
139
    }
}
21725
fn is_serde_content<T>() -> bool {
    #[derive(serde_derive::Deserialize)]
    enum A {}
    type B = A;
    #[derive(serde_derive::Deserialize)]
    #[serde(untagged)]
    enum UntaggedEnum {
        A(A),
        B(B),
    }
    struct TypeIdDeserializer;
    impl<'de> de::Deserializer<'de> for TypeIdDeserializer {
        type Error = TypeIdError;
7548
        fn deserialize_any<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value, Self::Error> {
7548
            Err(TypeIdError(typeid::of::<V::Value>()))
7548
        }
        serde::forward_to_deserialize_any! {
            bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
            bytes byte_buf option unit unit_struct newtype_struct seq tuple
            tuple_struct map struct enum identifier ignored_any
        }
    }
    #[derive(Debug)]
    struct TypeIdError(core::any::TypeId);
    impl core::fmt::Display for TypeIdError {
        fn fmt(&self, _fmt: &mut core::fmt::Formatter) -> core::fmt::Result {
            Ok(())
        }
    }
    impl de::Error for TypeIdError {
        #[allow(clippy::unreachable)]
        fn custom<T: core::fmt::Display>(_msg: T) -> Self {
            unreachable!()
        }
    }
    impl de::StdError for TypeIdError {}
95608
    fn type_id_of_untagged_enum_default_buffer() -> core::any::TypeId {
        static TYPE_ID: once_cell::race::OnceBox<core::any::TypeId> =
            once_cell::race::OnceBox::new();
95608
        *TYPE_ID.get_or_init(|| match Deserialize::deserialize(TypeIdDeserializer) {
            Ok(UntaggedEnum::A(void) | UntaggedEnum::B(void)) => match void {},
7548
            Err(TypeIdError(typeid)) => alloc::boxed::Box::new(typeid),
7548
        })
95608
    }
21725
    typeid::of::<T>() == type_id_of_untagged_enum_default_buffer()
21725
}
103925
fn is_serde_tag_or_content<T>() -> bool {
    #[derive(serde_derive::Deserialize)]
    enum A {}
    #[derive(serde_derive::Deserialize)]
    #[serde(tag = "tag")]
    enum InternallyTaggedEnum {
        A { a: A },
    }
    struct TypeIdDeserializer;
    impl<'de> de::Deserializer<'de> for TypeIdDeserializer {
        type Error = TypeIdError;
13473
        fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
13473
        where
13473
            V: Visitor<'de>,
        {
13473
            visitor.visit_map(self)
13473
        }
        serde::forward_to_deserialize_any! {
            bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
            bytes byte_buf option unit unit_struct newtype_struct seq tuple
            tuple_struct map struct enum identifier ignored_any
        }
    }
    impl<'de> de::MapAccess<'de> for TypeIdDeserializer {
        type Error = TypeIdError;
13473
        fn next_key_seed<K: DeserializeSeed<'de>>(
13473
            &mut self,
13473
            _seed: K,
13473
        ) -> Result<Option<K::Value>, Self::Error> {
13473
            Err(TypeIdError(typeid::of::<K::Value>()))
13473
        }
        #[allow(clippy::unreachable)]
        fn next_value_seed<V: DeserializeSeed<'de>>(
            &mut self,
            _seed: V,
        ) -> Result<V::Value, Self::Error> {
            unreachable!()
        }
    }
    #[derive(Debug)]
    struct TypeIdError(core::any::TypeId);
    impl core::fmt::Display for TypeIdError {
        fn fmt(&self, _fmt: &mut core::fmt::Formatter) -> core::fmt::Result {
            Ok(())
        }
    }
    impl de::Error for TypeIdError {
        #[allow(clippy::unreachable)]
        fn custom<T: core::fmt::Display>(_msg: T) -> Self {
            unreachable!()
        }
    }
    impl de::StdError for TypeIdError {}
364749
    fn type_id_of_internally_tagged_enum_default_tag_or_buffer() -> core::any::TypeId {
        static TYPE_ID: once_cell::race::OnceBox<core::any::TypeId> =
            once_cell::race::OnceBox::new();
364749
        *TYPE_ID.get_or_init(|| match Deserialize::deserialize(TypeIdDeserializer) {
            Ok(InternallyTaggedEnum::A { a: void }) => match void {},
13473
            Err(TypeIdError(typeid)) => alloc::boxed::Box::new(typeid),
13473
        })
364749
    }
103925
    typeid::of::<T>() == type_id_of_internally_tagged_enum_default_tag_or_buffer()
103925
}