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
const SERDE_CONTENT_CANARY: &str = "serde::__private::de::content::Content";
32
const 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.
38
pub 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

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

            
53
278
    pub fn from_bytes(input: &'de [u8]) -> SpannedResult<Self> {
54
278
        Self::from_bytes_with_options(input, &Options::default())
55
278
    }
56

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

            
66
543120
        deserializer.parser.exts |= options.default_extensions;
67

            
68
543120
        Ok(deserializer)
69
543928
    }
70

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

            
84
556
        Err(SpannedError {
85
556
            code: err.into(),
86
556
            span: Span {
87
556
                start: Position { line: 1, col: 1 },
88
556
                end: Position::from_src_end(valid_input),
89
556
            },
90
556
        })
91
4374
    }
92

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

            
98
    #[must_use]
99
109920
    pub fn span_error(&self, code: Error) -> SpannedError {
100
109920
        self.parser.span_error(code)
101
109920
    }
102

            
103
    #[must_use]
104
9730
    pub fn extensions(&self) -> Extensions {
105
9730
        self.parser.exts
106
9730
    }
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")]
112
324
pub fn from_reader<R, T>(rdr: R) -> SpannedResult<T>
113
324
where
114
324
    R: io::Read,
115
324
    T: de::DeserializeOwned,
116
{
117
324
    Options::default().from_reader(rdr)
118
324
}
119

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

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

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

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

            
164
430702
        if self.parser.src().is_empty() {
165
425690
            Ok(())
166
        } else {
167
5012
            Err(Error::TrailingCharacters)
168
        }
169
431258
    }
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
21284
    fn handle_any_struct<V>(&mut self, visitor: V, ident: Option<&str>) -> Result<V::Value>
177
21284
    where
178
21284
        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
21284
        let is_serde_content = core::any::type_name::<V::Value>() == SERDE_CONTENT_CANARY
183
20653
            || core::any::type_name::<V::Value>() == SERDE_TAG_KEY_CANARY;
184

            
185
21284
        let old_serde_content_newtype = self.serde_content_newtype;
186
21284
        self.serde_content_newtype = false;
187

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

            
223
68
                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
8420
                self.deserialize_tuple(0, visitor)
234
            }
235
        }
236
21284
    }
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
5278
    fn handle_struct_after_name<V>(
246
5278
        &mut self,
247
5278
        name_for_pretty_errors_only: &'static str,
248
5278
        visitor: V,
249
5278
    ) -> Result<V::Value>
250
5278
    where
251
5278
        V: Visitor<'de>,
252
    {
253
5278
        if self.newtype_variant || self.parser.consume_char('(') {
254
5258
            let old_newtype_variant = self.newtype_variant;
255
5258
            self.newtype_variant = false;
256

            
257
5258
            let value = guard_recursion! { self =>
258
5258
                visitor
259
5258
                    .visit_map(CommaSeparated::new(Terminator::Struct, self))
260
5258
                    .map_err(|err| {
261
1012
                        struct_error_name(
262
1012
                            err,
263
1012
                            if !old_newtype_variant && !name_for_pretty_errors_only.is_empty() {
264
254
                                Some(name_for_pretty_errors_only)
265
                            } else {
266
758
                                None
267
                            },
268
                        )
269
1012
                    })?
270
            };
271

            
272
4246
            self.parser.skip_ws()?;
273

            
274
4246
            if old_newtype_variant || self.parser.consume_char(')') {
275
4234
                Ok(value)
276
            } else {
277
12
                Err(Error::ExpectedStructLikeEnd)
278
            }
279
20
        } else if name_for_pretty_errors_only.is_empty() {
280
4
            Err(Error::ExpectedStructLike)
281
        } else {
282
16
            Err(Error::ExpectedNamedStructLike(name_for_pretty_errors_only))
283
        }
284
5278
    }
285
}
286

            
287
impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
288
    type Error = Error;
289

            
290
395739
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
291
395739
    where
292
395739
        V: Visitor<'de>,
293
    {
294
395739
        if self.newtype_variant {
295
2228
            if self.parser.check_char(')') {
296
                // newtype variant wraps the unit type / a unit struct without name
297
278
                return self.deserialize_unit(visitor);
298
1950
            }
299

            
300
            #[allow(clippy::wildcard_in_or_patterns)]
301
1950
            match self
302
1950
                .parser
303
1950
                .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
278
                    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
278
                    return self.deserialize_tuple(0, visitor);
314
                }
315
                // StructType::Unit is impossible with NewtypeMode::InsideNewtype
316
                // StructType::AnyTuple is impossible with TupleMode::DifferentiateNewtype
317
1394
                StructType::NewtypeTuple | _ => {
318
1394
                    // continue as usual with the inner content of the newtype variant
319
1394
                    self.newtype_variant = false;
320
1394
                }
321
            }
322
393511
        }
323

            
324
394905
        if self.parser.consume_ident("true") {
325
1445
            return visitor.visit_bool(true);
326
393460
        } else if self.parser.consume_ident("false") {
327
1405
            return visitor.visit_bool(false);
328
392055
        } else if self.parser.check_ident("Some") {
329
3972
            return self.deserialize_option(visitor);
330
388083
        } else if self.parser.consume_ident("None") {
331
7514
            return visitor.visit_none();
332
380569
        } else if self.parser.consume_str("()") {
333
656
            return visitor.visit_unit();
334
379913
        } else if self.parser.consume_ident("inf") || self.parser.consume_ident("inff32") {
335
842
            return visitor.visit_f32(core::f32::INFINITY);
336
379071
        } else if self.parser.consume_ident("inff64") {
337
556
            return visitor.visit_f64(core::f64::INFINITY);
338
378515
        } else if self.parser.consume_ident("NaN") || self.parser.consume_ident("NaNf32") {
339
842
            return visitor.visit_f32(core::f32::NAN);
340
377673
        } else if self.parser.consume_ident("NaNf64") {
341
556
            return visitor.visit_f64(core::f64::NAN);
342
377117
        }
343

            
344
        // `skip_identifier` does not change state if it fails
345
377117
        if let Some(ident) = self.parser.skip_identifier() {
346
11057
            self.parser.skip_ws()?;
347

            
348
11057
            return self.handle_any_struct(visitor, Some(ident));
349
366060
        }
350

            
351
366060
        match self.parser.peek_char_or_eof()? {
352
10227
            '(' => self.handle_any_struct(visitor, None),
353
1690
            '[' => self.deserialize_seq(visitor),
354
73982
            '{' => self.deserialize_map(visitor),
355
54207
            '0'..='9' | '+' | '-' | '.' => self.parser.any_number()?.visit(visitor),
356
5730
            '"' | 'r' => self.deserialize_string(visitor),
357
216578
            'b' if self.parser.src().starts_with("b'") => self.parser.any_number()?.visit(visitor),
358
2240
            'b' => self.deserialize_byte_buf(visitor),
359
1700
            '\'' => self.deserialize_char(visitor),
360
834
            other => Err(Error::UnexpectedChar(other)),
361
        }
362
395739
    }
363

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

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

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

            
385
1095
    fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value>
386
1095
    where
387
1095
        V: Visitor<'de>,
388
    {
389
1095
        visitor.visit_i32(self.parser.integer()?)
390
1095
    }
391

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

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

            
407
23698
    fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value>
408
23698
    where
409
23698
        V: Visitor<'de>,
410
    {
411
23698
        visitor.visit_u8(self.parser.integer()?)
412
23698
    }
413

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

            
421
473
    fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value>
422
473
    where
423
473
        V: Visitor<'de>,
424
    {
425
473
        visitor.visit_u32(self.parser.integer()?)
426
473
    }
427

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

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

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

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

            
457
2418
    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
458
2418
    where
459
2418
        V: Visitor<'de>,
460
    {
461
2418
        visitor.visit_char(self.parser.char()?)
462
2418
    }
463

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

            
474
6113
    fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
475
6113
    where
476
6113
        V: Visitor<'de>,
477
    {
478
6113
        self.deserialize_str(visitor)
479
6113
    }
480

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

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

            
497
2388
        match self.parser.byte_string()? {
498
616
            ParsedByteStr::Allocated(byte_buf) => visitor.visit_byte_buf(byte_buf),
499
1724
            ParsedByteStr::Slice(bytes) => visitor.visit_borrowed_bytes(bytes),
500
        }
501
2392
    }
502

            
503
4432
    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
504
4432
    where
505
4432
        V: Visitor<'de>,
506
    {
507
4432
        if self.parser.consume_ident("None") {
508
112
            visitor.visit_none()
509
4320
        } else if self.parser.consume_ident("Some") && {
510
4152
            self.parser.skip_ws()?;
511
4152
            self.parser.consume_char('(')
512
        } {
513
4152
            self.parser.skip_ws()?;
514

            
515
4152
            self.newtype_variant = self
516
4152
                .parser
517
4152
                .exts
518
4152
                .contains(Extensions::UNWRAP_VARIANT_NEWTYPES);
519

            
520
4152
            let v = guard_recursion! { self => visitor.visit_some(&mut *self)? };
521

            
522
4148
            self.newtype_variant = false;
523

            
524
4148
            self.parser.comma()?;
525

            
526
4148
            if self.parser.consume_char(')') {
527
3866
                Ok(v)
528
            } else {
529
282
                Err(Error::ExpectedOptionEnd)
530
            }
531
168
        } else if self.parser.exts.contains(Extensions::IMPLICIT_SOME) {
532
164
            guard_recursion! { self => visitor.visit_some(&mut *self) }
533
        } else {
534
4
            Err(Error::ExpectedOption)
535
        }
536
4432
    }
537

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

            
546
434
            visitor.visit_unit()
547
        } else {
548
4
            Err(Error::ExpectedUnit)
549
        }
550
438
    }
551

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

            
559
56
            visitor.visit_unit()
560
        } else {
561
84
            self.deserialize_unit(visitor)
562
        }
563
160
    }
564

            
565
13560
    fn deserialize_newtype_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
566
13560
    where
567
13560
        V: Visitor<'de>,
568
    {
569
13560
        if name == crate::value::raw::RAW_VALUE_TOKEN {
570
13146
            let src_before = self.parser.pre_ws_src();
571
13146
            self.parser.skip_ws()?;
572
13146
            let _ignored = self.deserialize_ignored_any(serde::de::IgnoredAny)?;
573
12312
            self.parser.skip_ws()?;
574
12312
            let src_after = self.parser.src();
575

            
576
12312
            if self.parser.has_unclosed_line_comment() {
577
1112
                return Err(Error::UnclosedLineComment);
578
11200
            }
579

            
580
11200
            let ron_str = &src_before[..src_before.len() - src_after.len()];
581

            
582
11200
            return visitor
583
11200
                .visit_borrowed_str::<Error>(ron_str)
584
11200
                .map_err(|_| Error::ExpectedRawValue);
585
414
        }
586

            
587
414
        if self.parser.exts.contains(Extensions::UNWRAP_NEWTYPES) || self.newtype_variant {
588
96
            self.newtype_variant = false;
589

            
590
96
            return guard_recursion! { self => visitor.visit_newtype_struct(&mut *self) };
591
318
        }
592

            
593
318
        self.parser.consume_struct_name(name)?;
594

            
595
291
        self.parser.skip_ws()?;
596

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

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

            
614
7152
    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
615
7152
    where
616
7152
        V: Visitor<'de>,
617
    {
618
7152
        self.newtype_variant = false;
619

            
620
7152
        if self.parser.consume_char('[') {
621
7140
            let value = guard_recursion! { self =>
622
7140
                visitor.visit_seq(CommaSeparated::new(Terminator::Seq, self))?
623
            };
624
6854
            self.parser.skip_ws()?;
625

            
626
6854
            if self.parser.consume_char(']') {
627
6842
                Ok(value)
628
            } else {
629
12
                Err(Error::ExpectedArrayEnd)
630
            }
631
        } else {
632
12
            Err(Error::ExpectedArray)
633
        }
634
7152
    }
635

            
636
9180
    fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
637
9180
    where
638
9180
        V: Visitor<'de>,
639
    {
640
9180
        if self.newtype_variant || self.parser.consume_char('(') {
641
9124
            let old_newtype_variant = self.newtype_variant;
642
9124
            self.newtype_variant = false;
643

            
644
9124
            let value = guard_recursion! { self =>
645
9124
                visitor.visit_seq(CommaSeparated::new(Terminator::Tuple, self))?
646
            };
647
8248
            self.parser.skip_ws()?;
648

            
649
8248
            if old_newtype_variant || self.parser.consume_char(')') {
650
8236
                Ok(value)
651
            } else {
652
12
                Err(Error::ExpectedStructLikeEnd)
653
            }
654
        } else {
655
56
            Err(Error::ExpectedStructLike)
656
        }
657
9180
    }
658

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

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

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

            
689
74402
        self.newtype_variant = false;
690

            
691
        // TODO: Avoid allocating to perform this check.
692
74402
        let serde_flatten_canary = VisitorExpecting(&visitor)
693
74402
            .to_string()
694
74402
            .starts_with("struct ");
695

            
696
74402
        let terminator = if serde_flatten_canary {
697
276
            Terminator::MapAsStruct
698
        } else {
699
74126
            Terminator::Map
700
        };
701

            
702
74402
        if self.parser.consume_char('{') {
703
74390
            let value = guard_recursion! { self =>
704
73278
                visitor.visit_map(CommaSeparated::new(terminator, self))?
705
            };
706
2474
            self.parser.skip_ws()?;
707

            
708
2474
            if self.parser.consume_char('}') {
709
2462
                Ok(value)
710
            } else {
711
12
                Err(Error::ExpectedMapEnd)
712
            }
713
        } else {
714
12
            Err(Error::ExpectedMap)
715
        }
716
74402
    }
717

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

            
731
907
        self.parser.skip_ws()?;
732

            
733
907
        self.handle_struct_after_name(name, visitor)
734
943
    }
735

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

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

            
762
9317
    fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
763
9317
    where
764
9317
        V: Visitor<'de>,
765
    {
766
9317
        let identifier = self.parser.identifier()?;
767

            
768
9249
        self.last_identifier = Some(identifier);
769

            
770
9249
        visitor.visit_borrowed_str(identifier)
771
9317
    }
772

            
773
55044
    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
774
55044
    where
775
55044
        V: Visitor<'de>,
776
    {
777
55044
        self.deserialize_any(visitor)
778
55044
    }
779
}
780

            
781
enum Terminator {
782
    Map,
783
    MapAsStruct,
784
    Tuple,
785
    Struct,
786
    Seq,
787
}
788

            
789
impl Terminator {
790
562000
    fn as_char(&self) -> char {
791
562000
        match self {
792
160210
            Terminator::Map | Terminator::MapAsStruct => '}',
793
357362
            Terminator::Tuple | Terminator::Struct => ')',
794
44428
            Terminator::Seq => ']',
795
        }
796
562000
    }
797
}
798

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

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

            
816
562000
    fn has_element(&mut self) -> Result<bool> {
817
562000
        self.de.parser.skip_ws()?;
818

            
819
562000
        match (
820
562000
            self.had_comma,
821
562000
            !self.de.parser.check_char(self.terminator.as_char()),
822
562000
        ) {
823
            // Trailing comma, maybe has a next element
824
492379
            (true, has_element) => Ok(has_element),
825
            // No trailing comma but terminator
826
68509
            (false, false) => Ok(false),
827
            // No trailing comma or terminator
828
1112
            (false, true) => Err(Error::ExpectedComma),
829
        }
830
562000
    }
831
}
832

            
833
impl<'de, 'a> de::SeqAccess<'de> for CommaSeparated<'a, 'de> {
834
    type Error = Error;
835

            
836
45494
    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
837
45494
    where
838
45494
        T: DeserializeSeed<'de>,
839
    {
840
45494
        if self.has_element()? {
841
30777
            let res = guard_recursion! { self.de => seed.deserialize(&mut *self.de)? };
842

            
843
29630
            self.had_comma = self.de.parser.comma()?;
844

            
845
29630
            Ok(Some(res))
846
        } else {
847
14709
            Ok(None)
848
        }
849
45494
    }
850
}
851

            
852
impl<'de, 'a> de::MapAccess<'de> for CommaSeparated<'a, 'de> {
853
    type Error = Error;
854

            
855
88997
    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
856
88997
    where
857
88997
        K: DeserializeSeed<'de>,
858
    {
859
88997
        if self.has_element()? {
860
82136
            self.inside_internally_tagged_enum =
861
82136
                core::any::type_name::<K::Value>() == SERDE_TAG_KEY_CANARY;
862

            
863
82136
            match self.terminator {
864
8368
                Terminator::Struct => guard_recursion! { self.de =>
865
8368
                    seed.deserialize(&mut id::Deserializer::new(&mut *self.de, false)).map(Some)
866
                },
867
612
                Terminator::MapAsStruct => guard_recursion! { self.de =>
868
612
                    seed.deserialize(&mut id::Deserializer::new(&mut *self.de, true)).map(Some)
869
                },
870
73156
                _ => guard_recursion! { self.de => seed.deserialize(&mut *self.de).map(Some) },
871
            }
872
        } else {
873
6853
            Ok(None)
874
        }
875
88997
    }
876

            
877
12094
    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
878
12094
    where
879
12094
        V: DeserializeSeed<'de>,
880
    {
881
12094
        self.de.parser.skip_ws()?;
882

            
883
12094
        if self.de.parser.consume_char(':') {
884
11808
            self.de.parser.skip_ws()?;
885

            
886
11808
            let res = if self.inside_internally_tagged_enum
887
373
                && core::any::type_name::<V::Value>() != SERDE_CONTENT_CANARY
888
            {
889
217
                guard_recursion! { self.de =>
890
217
                    seed.deserialize(&mut tag::Deserializer::new(&mut *self.de))?
891
                }
892
            } else {
893
11591
                guard_recursion! { self.de =>
894
11591
                    seed.deserialize(&mut *self.de)?
895
                }
896
            };
897

            
898
11061
            self.had_comma = self.de.parser.comma()?;
899

            
900
11061
            Ok(res)
901
        } else {
902
286
            Err(Error::ExpectedMapColon)
903
        }
904
12094
    }
905
}
906

            
907
struct Enum<'a, 'de: 'a> {
908
    de: &'a mut Deserializer<'de>,
909
}
910

            
911
impl<'a, 'de> Enum<'a, 'de> {
912
65527
    fn new(de: &'a mut Deserializer<'de>) -> Self {
913
65527
        Enum { de }
914
65527
    }
915
}
916

            
917
impl<'de, 'a> de::EnumAccess<'de> for Enum<'a, 'de> {
918
    type Error = Error;
919
    type Variant = Self;
920

            
921
1049
    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)>
922
1049
    where
923
1049
        V: DeserializeSeed<'de>,
924
    {
925
1049
        self.de.parser.skip_ws()?;
926

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

            
929
1011
        Ok((value, self))
930
1049
    }
931
}
932

            
933
impl<'de, 'a> de::VariantAccess<'de> for Enum<'a, 'de> {
934
    type Error = Error;
935

            
936
16160
    fn unit_variant(self) -> Result<()> {
937
16160
        Ok(())
938
16160
    }
939

            
940
515
    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
941
515
    where
942
515
        T: DeserializeSeed<'de>,
943
    {
944
515
        let newtype_variant = self.de.last_identifier;
945

            
946
515
        self.de.parser.skip_ws()?;
947

            
948
515
        if self.de.parser.consume_char('(') {
949
503
            self.de.parser.skip_ws()?;
950

            
951
503
            self.de.newtype_variant = self
952
503
                .de
953
503
                .parser
954
503
                .exts
955
503
                .contains(Extensions::UNWRAP_VARIANT_NEWTYPES);
956

            
957
503
            let val = guard_recursion! { self.de =>
958
503
                seed
959
503
                    .deserialize(&mut *self.de)
960
503
                    .map_err(|err| struct_error_name(err, newtype_variant))?
961
            };
962

            
963
372
            self.de.newtype_variant = false;
964

            
965
372
            self.de.parser.comma()?;
966

            
967
372
            if self.de.parser.consume_char(')') {
968
360
                Ok(val)
969
            } else {
970
12
                Err(Error::ExpectedStructLikeEnd)
971
            }
972
        } else {
973
12
            Err(Error::ExpectedStructLike)
974
        }
975
515
    }
976

            
977
99
    fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value>
978
99
    where
979
99
        V: Visitor<'de>,
980
    {
981
99
        self.de.parser.skip_ws()?;
982

            
983
99
        self.de.deserialize_tuple(len, visitor)
984
99
    }
985

            
986
129
    fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value>
987
129
    where
988
129
        V: Visitor<'de>,
989
    {
990
129
        let struct_variant = self.de.last_identifier;
991

            
992
129
        self.de.parser.skip_ws()?;
993

            
994
129
        self.de
995
129
            .handle_struct_after_name("", visitor)
996
129
            .map_err(|err| struct_error_name(err, struct_variant))
997
129
    }
998
}
999

            
43292
fn struct_error_name(error: Error, name: Option<&str>) -> Error {
3694
    match error {
        Error::NoSuchStructField {
3694
            expected,
3694
            found,
            outer: None,
3694
        } => Error::NoSuchStructField {
3694
            expected,
3694
            found,
3694
            outer: name.map(ToOwned::to_owned),
3694
        },
4318
        Error::MissingStructField { field, outer: None } => Error::MissingStructField {
4318
            field,
4318
            outer: name.map(ToOwned::to_owned),
4318
        },
3694
        Error::DuplicateStructField { field, outer: None } => Error::DuplicateStructField {
3694
            field,
3694
            outer: name.map(ToOwned::to_owned),
3694
        },
31586
        e => e,
    }
43292
}
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(serde::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
    }
}