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

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

            
68
539319
        Ok(deserializer)
69
539911
    }
70

            
71
    // FIXME: panic is not actually possible, remove once utf8_chunks is stabilized
72
    #[allow(clippy::missing_panics_doc)]
73
1696
    pub fn from_bytes_with_options(input: &'de [u8], options: &Options) -> SpannedResult<Self> {
74
1696
        let err = match str::from_utf8(input) {
75
1140
            Ok(input) => return Self::from_str_with_options(input, options),
76
556
            Err(err) => err,
77
556
        };
78
556

            
79
556
        // FIXME: use [`utf8_chunks`](https://github.com/rust-lang/rust/issues/99543) once stabilised
80
556
        #[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
556

            
84
556
        Err(SpannedError {
85
556
            code: err.into(),
86
556
            position: Position::from_src_end(valid_input),
87
556
        })
88
1696
    }
89

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

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

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

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

            
126
/// A convenience function for building a deserializer
127
/// and deserializing a value of type `T` from bytes.
128
312
pub fn from_bytes<'a, T>(s: &'a [u8]) -> SpannedResult<T>
129
312
where
130
312
    T: de::Deserialize<'a>,
131
312
{
132
312
    Options::default().from_bytes(s)
133
312
}
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
431258
    pub fn end(&mut self) -> Result<()> {
159
431258
        self.parser.skip_ws()?;
160

            
161
430702
        if self.parser.src().is_empty() {
162
425690
            Ok(())
163
        } else {
164
5012
            Err(Error::TrailingCharacters)
165
        }
166
431258
    }
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
21272
    fn handle_any_struct<V>(&mut self, visitor: V, ident: Option<&str>) -> Result<V::Value>
174
21272
    where
175
21272
        V: Visitor<'de>,
176
21272
    {
177
        // HACK: switch to JSON enum semantics for JSON content
178
        // Robust impl blocked on https://github.com/serde-rs/serde/pull/2420
179
21272
        let is_serde_content = core::any::type_name::<V::Value>() == SERDE_CONTENT_CANARY
180
20650
            || core::any::type_name::<V::Value>() == SERDE_TAG_KEY_CANARY;
181

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

            
185
21272
        match (
186
21272
            self.parser.check_struct_type(
187
21272
                NewtypeMode::NoParensMeanUnit,
188
21272
                if old_serde_content_newtype {
189
128
                    TupleMode::DifferentiateNewtype // separate match on NewtypeOrTuple below
190
                } else {
191
21144
                    TupleMode::ImpreciseTupleOrNewtype // Tuple and NewtypeOrTuple match equally
192
                },
193
16
            )?,
194
21256
            ident,
195
        ) {
196
52
            (StructType::Unit, Some(ident)) if is_serde_content => {
197
52
                // serde's Content type needs the ident for unit variants
198
52
                visitor.visit_str(ident)
199
            }
200
8622
            (StructType::Unit, _) => visitor.visit_unit(),
201
136
            (_, Some(ident)) if is_serde_content => {
202
136
                // serde's Content type uses a singleton map encoding for enums
203
136
                visitor.visit_map(SerdeEnumContent {
204
136
                    de: self,
205
136
                    ident: Some(ident),
206
136
                })
207
            }
208
            (StructType::Named, _) => {
209
                // giving no name results in worse errors but is necessary here
210
3958
                self.handle_struct_after_name("", visitor)
211
            }
212
68
            (StructType::NewtypeTuple, _) if old_serde_content_newtype => {
213
68
                // 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
68

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

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

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

            
271
4240
            if old_newtype_variant || self.parser.consume_char(')') {
272
4228
                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
5230
    }
282
}
283

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

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

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

            
321
394887
        if self.parser.consume_ident("true") {
322
1442
            return visitor.visit_bool(true);
323
393445
        } else if self.parser.consume_ident("false") {
324
1402
            return visitor.visit_bool(false);
325
392043
        } else if self.parser.check_ident("Some") {
326
3972
            return self.deserialize_option(visitor);
327
388071
        } else if self.parser.consume_ident("None") {
328
7514
            return visitor.visit_none();
329
380557
        } else if self.parser.consume_str("()") {
330
656
            return visitor.visit_unit();
331
379901
        } else if self.parser.consume_ident("inf") || self.parser.consume_ident("inff32") {
332
842
            return visitor.visit_f32(core::f32::INFINITY);
333
379059
        } else if self.parser.consume_ident("inff64") {
334
556
            return visitor.visit_f64(core::f64::INFINITY);
335
378503
        } else if self.parser.consume_ident("NaN") || self.parser.consume_ident("NaNf32") {
336
842
            return visitor.visit_f32(core::f32::NAN);
337
377661
        } else if self.parser.consume_ident("NaNf64") {
338
556
            return visitor.visit_f64(core::f64::NAN);
339
377105
        }
340

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

            
345
11054
            return self.handle_any_struct(visitor, Some(ident));
346
366051
        }
347
366051

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

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

            
368
92
    fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value>
369
92
    where
370
92
        V: Visitor<'de>,
371
92
    {
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
52
    {
379
52
        visitor.visit_i16(self.parser.integer()?)
380
52
    }
381

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

            
389
118
    fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value>
390
118
    where
391
118
        V: Visitor<'de>,
392
118
    {
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
32
    {
401
32
        visitor.visit_i128(self.parser.integer()?)
402
32
    }
403

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

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

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

            
425
58
    fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value>
426
58
    where
427
58
        V: Visitor<'de>,
428
58
    {
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
38
    {
437
38
        visitor.visit_u128(self.parser.integer()?)
438
38
    }
439

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

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

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

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

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

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

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

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

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

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

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

            
519
4148
            self.newtype_variant = false;
520
4148

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

            
523
4148
            if self.parser.consume_char(')') {
524
3866
                Ok(v)
525
            } else {
526
282
                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
4432
    }
534

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

            
543
434
            visitor.visit_unit()
544
        } else {
545
4
            Err(Error::ExpectedUnit)
546
        }
547
438
    }
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
160
    {
553
160
        if self.newtype_variant || self.parser.consume_struct_name(name)? {
554
56
            self.newtype_variant = false;
555
56

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

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

            
573
12312
            if self.parser.has_unclosed_line_comment() {
574
1112
                return Err(Error::UnclosedLineComment);
575
11200
            }
576
11200

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

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

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

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

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

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

            
594
288
        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
24
        } else if name.is_empty() {
605
12
            Err(Error::ExpectedStructLike)
606
        } else {
607
12
            Err(Error::ExpectedNamedStructLike(name))
608
        }
609
13554
    }
610

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

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

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

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

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

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

            
656
220
    fn deserialize_tuple_struct<V>(
657
220
        self,
658
220
        name: &'static str,
659
220
        len: usize,
660
220
        visitor: V,
661
220
    ) -> Result<V::Value>
662
220
    where
663
220
        V: Visitor<'de>,
664
220
    {
665
220
        if !self.newtype_variant {
666
204
            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
196
        })
673
220
    }
674

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

            
686
74402
        self.newtype_variant = false;
687
74402

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

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

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

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

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

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

            
730
886
        self.handle_struct_after_name(name, visitor)
731
922
    }
732

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

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

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

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

            
767
9084
        visitor.visit_borrowed_str(identifier)
768
9152
    }
769

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

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

            
786
impl Terminator {
787
552325
    fn as_char(&self) -> char {
788
552325
        match self {
789
160210
            Terminator::Map | Terminator::MapAsStruct => '}',
790
347687
            Terminator::Tuple | Terminator::Struct => ')',
791
44428
            Terminator::Seq => ']',
792
        }
793
552325
    }
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
255447
    fn new(terminator: Terminator, de: &'a mut Deserializer<'de>) -> Self {
805
255447
        CommaSeparated {
806
255447
            de,
807
255447
            terminator,
808
255447
            had_comma: true,
809
255447
            inside_internally_tagged_enum: false,
810
255447
        }
811
255447
    }
812

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

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

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

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

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

            
842
29624
            Ok(Some(res))
843
        } else {
844
14706
            Ok(None)
845
        }
846
45482
    }
847
}
848

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

            
852
88856
    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
853
88856
    where
854
88856
        K: DeserializeSeed<'de>,
855
88856
    {
856
88856
        if self.has_element()? {
857
82010
            self.inside_internally_tagged_enum =
858
82010
                core::any::type_name::<K::Value>() == SERDE_TAG_KEY_CANARY;
859
82010

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

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

            
880
11992
        if self.de.parser.consume_char(':') {
881
11706
            self.de.parser.skip_ws()?;
882

            
883
11706
            let res = if self.inside_internally_tagged_enum
884
370
                && core::any::type_name::<V::Value>() != SERDE_CONTENT_CANARY
885
            {
886
214
                guard_recursion! { self.de =>
887
214
                    seed.deserialize(&mut tag::Deserializer::new(&mut *self.de))?
888
                }
889
            } else {
890
11492
                guard_recursion! { self.de =>
891
11492
                    seed.deserialize(&mut *self.de)?
892
                }
893
            };
894

            
895
10968
            self.had_comma = self.de.parser.comma()?;
896

            
897
10968
            Ok(res)
898
        } else {
899
286
            Err(Error::ExpectedMapColon)
900
        }
901
11992
    }
902
}
903

            
904
struct Enum<'a, 'de: 'a> {
905
    de: &'a mut Deserializer<'de>,
906
}
907

            
908
impl<'a, 'de> Enum<'a, 'de> {
909
62797
    fn new(de: &'a mut Deserializer<'de>) -> Self {
910
62797
        Enum { de }
911
62797
    }
912
}
913

            
914
impl<'de, 'a> de::EnumAccess<'de> for Enum<'a, 'de> {
915
    type Error = Error;
916
    type Variant = Self;
917

            
918
1010
    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)>
919
1010
    where
920
1010
        V: DeserializeSeed<'de>,
921
1010
    {
922
1010
        self.de.parser.skip_ws()?;
923

            
924
1010
        let value = guard_recursion! { self.de => seed.deserialize(&mut *self.de)? };
925

            
926
978
        Ok((value, self))
927
1010
    }
928
}
929

            
930
impl<'de, 'a> de::VariantAccess<'de> for Enum<'a, 'de> {
931
    type Error = Error;
932

            
933
16160
    fn unit_variant(self) -> Result<()> {
934
16160
        Ok(())
935
16160
    }
936

            
937
506
    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
938
506
    where
939
506
        T: DeserializeSeed<'de>,
940
506
    {
941
506
        let newtype_variant = self.de.last_identifier;
942
506

            
943
506
        self.de.parser.skip_ws()?;
944

            
945
506
        if self.de.parser.consume_char('(') {
946
494
            self.de.parser.skip_ws()?;
947

            
948
494
            self.de.newtype_variant = self
949
494
                .de
950
494
                .parser
951
494
                .exts
952
494
                .contains(Extensions::UNWRAP_VARIANT_NEWTYPES);
953

            
954
494
            let val = guard_recursion! { self.de =>
955
494
                seed
956
494
                    .deserialize(&mut *self.de)
957
494
                    .map_err(|err| struct_error_name(err, newtype_variant))?
958
            };
959

            
960
372
            self.de.newtype_variant = false;
961
372

            
962
372
            self.de.parser.comma()?;
963

            
964
372
            if self.de.parser.consume_char(')') {
965
360
                Ok(val)
966
            } else {
967
12
                Err(Error::ExpectedStructLikeEnd)
968
            }
969
        } else {
970
12
            Err(Error::ExpectedStructLike)
971
        }
972
506
    }
973

            
974
96
    fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value>
975
96
    where
976
96
        V: Visitor<'de>,
977
96
    {
978
96
        self.de.parser.skip_ws()?;
979

            
980
96
        self.de.deserialize_tuple(len, visitor)
981
96
    }
982

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

            
989
108
        self.de.parser.skip_ws()?;
990

            
991
108
        self.de
992
108
            .handle_struct_after_name("", visitor)
993
108
            .map_err(|err| struct_error_name(err, struct_variant))
994
108
    }
995
}
996

            
997
38666
fn struct_error_name(error: Error, name: Option<&str>) -> Error {
998
2224
    match error {
999
        Error::NoSuchStructField {
2224
            expected,
2224
            found,
2224
            outer: None,
2224
        } => Error::NoSuchStructField {
2224
            expected,
2224
            found,
2224
            outer: name.map(ToOwned::to_owned),
2224
        },
3058
        Error::MissingStructField { field, outer: None } => Error::MissingStructField {
3058
            field,
3058
            outer: name.map(ToOwned::to_owned),
3058
        },
2224
        Error::DuplicateStructField { field, outer: None } => Error::DuplicateStructField {
2224
            field,
2224
            outer: name.map(ToOwned::to_owned),
2224
        },
31160
        e => e,
    }
38666
}
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;
260
    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
260
    where
260
        K: DeserializeSeed<'de>,
260
    {
260
        self.ident
260
            .take()
260
            .map(|ident| seed.deserialize(serde::de::value::StrDeserializer::new(ident)))
260
            .transpose()
260
    }
136
    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
136
    where
136
        V: DeserializeSeed<'de>,
136
    {
136
        self.de.parser.skip_ws()?;
136
        let old_serde_content_newtype = self.de.serde_content_newtype;
136
        self.de.serde_content_newtype = true;
136
        let result = seed.deserialize(&mut *self.de);
136
        self.de.serde_content_newtype = old_serde_content_newtype;
136

            
136
        result
136
    }
}