1
/// Deserialization module.
2
use std::{
3
    io::{self, Write},
4
    str,
5
};
6

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

            
12
pub use crate::error::{Error, Position, SpannedError};
13
use crate::{
14
    error::{Result, SpannedResult},
15
    extensions::Extensions,
16
    options::Options,
17
    parse::{NewtypeMode, ParsedByteStr, ParsedStr, Parser, StructType, TupleMode},
18
};
19

            
20
mod id;
21
mod tag;
22
#[cfg(test)]
23
mod tests;
24
mod value;
25

            
26
const SERDE_CONTENT_CANARY: &str = "serde::__private::de::content::Content";
27
const SERDE_TAG_KEY_CANARY: &str = "serde::__private::de::content::TagOrContent";
28

            
29
/// The RON deserializer.
30
///
31
/// If you just want to simply deserialize a value,
32
/// you can use the [`from_str`] convenience function.
33
pub struct Deserializer<'de> {
34
    pub(crate) parser: Parser<'de>,
35
    newtype_variant: bool,
36
    serde_content_newtype: bool,
37
    last_identifier: Option<&'de str>,
38
    recursion_limit: Option<usize>,
39
}
40

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

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

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

            
61
539319
        deserializer.parser.exts |= options.default_extensions;
62
539319

            
63
539319
        Ok(deserializer)
64
539911
    }
65

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

            
74
556
        // FIXME: use [`utf8_chunks`](https://github.com/rust-lang/rust/issues/99543) once stabilised
75
556
        #[allow(clippy::expect_used)]
76
556
        let valid_input =
77
556
            str::from_utf8(&input[..err.valid_up_to()]).expect("source is valid up to error");
78
556

            
79
556
        Err(SpannedError {
80
556
            code: err.into(),
81
556
            position: Position::from_src_end(valid_input),
82
556
        })
83
1696
    }
84

            
85
    #[must_use]
86
8
    pub fn remainder(&self) -> &'de str {
87
8
        self.parser.src()
88
8
    }
89

            
90
    #[must_use]
91
106119
    pub fn span_error(&self, code: Error) -> SpannedError {
92
106119
        self.parser.span_error(code)
93
106119
    }
94

            
95
    #[must_use]
96
9730
    pub fn extensions(&self) -> Extensions {
97
9730
        self.parser.exts
98
9730
    }
99
}
100

            
101
/// A convenience function for building a deserializer
102
/// and deserializing a value of type `T` from a reader.
103
296
pub fn from_reader<R, T>(rdr: R) -> SpannedResult<T>
104
296
where
105
296
    R: io::Read,
106
296
    T: de::DeserializeOwned,
107
296
{
108
296
    Options::default().from_reader(rdr)
109
296
}
110

            
111
/// A convenience function for building a deserializer
112
/// and deserializing a value of type `T` from a string.
113
7726
pub fn from_str<'a, T>(s: &'a str) -> SpannedResult<T>
114
7726
where
115
7726
    T: de::Deserialize<'a>,
116
7726
{
117
7726
    Options::default().from_str(s)
118
7726
}
119

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

            
129
macro_rules! guard_recursion {
130
    ($self:expr => $expr:expr) => {{
131
        if let Some(limit) = &mut $self.recursion_limit {
132
            if let Some(new_limit) = limit.checked_sub(1) {
133
                *limit = new_limit;
134
            } else {
135
                return Err(Error::ExceededRecursionLimit);
136
            }
137
        }
138

            
139
        let result = $expr;
140

            
141
        if let Some(limit) = &mut $self.recursion_limit {
142
            *limit = limit.saturating_add(1);
143
        }
144

            
145
        result
146
    }};
147
}
148

            
149
impl<'de> Deserializer<'de> {
150
    /// Check if the remaining bytes are whitespace only,
151
    /// otherwise return an error.
152
431258
    pub fn end(&mut self) -> Result<()> {
153
431258
        self.parser.skip_ws()?;
154

            
155
430702
        if self.parser.src().is_empty() {
156
425690
            Ok(())
157
        } else {
158
5012
            Err(Error::TrailingCharacters)
159
        }
160
431258
    }
161

            
162
    /// Called from [`deserialize_any`][serde::Deserializer::deserialize_any]
163
    /// when a struct was detected. Decides if there is a unit, tuple or usual
164
    /// struct and deserializes it accordingly.
165
    ///
166
    /// This method assumes there is no identifier left.
167
21272
    fn handle_any_struct<V>(&mut self, visitor: V, ident: Option<&str>) -> Result<V::Value>
168
21272
    where
169
21272
        V: Visitor<'de>,
170
21272
    {
171
        // HACK: switch to JSON enum semantics for JSON content
172
        // Robust impl blocked on https://github.com/serde-rs/serde/pull/2420
173
21272
        let is_serde_content = std::any::type_name::<V::Value>() == SERDE_CONTENT_CANARY
174
20650
            || std::any::type_name::<V::Value>() == SERDE_TAG_KEY_CANARY;
175

            
176
21272
        let old_serde_content_newtype = self.serde_content_newtype;
177
21272
        self.serde_content_newtype = false;
178
21272

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

            
214
68
                result
215
            }
216
            (
217
                StructType::AnyTuple
218
                | StructType::EmptyTuple
219
                | StructType::NewtypeTuple
220
                | StructType::NonNewtypeTuple,
221
                _,
222
            ) => {
223
                // first argument is technically incorrect, but ignored anyway
224
8420
                self.deserialize_tuple(0, visitor)
225
            }
226
        }
227
21272
    }
228

            
229
    /// Called from
230
    /// [`deserialize_struct`][serde::Deserializer::deserialize_struct],
231
    /// [`struct_variant`][serde::de::VariantAccess::struct_variant], and
232
    /// [`handle_any_struct`][Self::handle_any_struct]. Handles
233
    /// deserialising the enclosing parentheses and everything in between.
234
    ///
235
    /// This method assumes there is no struct name identifier left.
236
5230
    fn handle_struct_after_name<V>(
237
5230
        &mut self,
238
5230
        name_for_pretty_errors_only: &'static str,
239
5230
        visitor: V,
240
5230
    ) -> Result<V::Value>
241
5230
    where
242
5230
        V: Visitor<'de>,
243
5230
    {
244
5230
        if self.newtype_variant || self.parser.consume_char('(') {
245
5210
            let old_newtype_variant = self.newtype_variant;
246
5210
            self.newtype_variant = false;
247

            
248
5210
            let value = guard_recursion! { self =>
249
5210
                visitor
250
5210
                    .visit_map(CommaSeparated::new(Terminator::Struct, self))
251
5210
                    .map_err(|err| {
252
970
                        struct_error_name(
253
970
                            err,
254
970
                            if !old_newtype_variant && !name_for_pretty_errors_only.is_empty() {
255
242
                                Some(name_for_pretty_errors_only)
256
                            } else {
257
728
                                None
258
                            },
259
                        )
260
5210
                    })?
261
            };
262

            
263
4240
            self.parser.skip_ws()?;
264

            
265
4240
            if old_newtype_variant || self.parser.consume_char(')') {
266
4228
                Ok(value)
267
            } else {
268
12
                Err(Error::ExpectedStructLikeEnd)
269
            }
270
20
        } else if name_for_pretty_errors_only.is_empty() {
271
4
            Err(Error::ExpectedStructLike)
272
        } else {
273
16
            Err(Error::ExpectedNamedStructLike(name_for_pretty_errors_only))
274
        }
275
5230
    }
276
}
277

            
278
impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
279
    type Error = Error;
280

            
281
395721
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
282
395721
    where
283
395721
        V: Visitor<'de>,
284
395721
    {
285
395721
        if self.newtype_variant {
286
2228
            if self.parser.check_char(')') {
287
                // newtype variant wraps the unit type / a unit struct without name
288
278
                return self.deserialize_unit(visitor);
289
1950
            }
290
1950

            
291
1950
            #[allow(clippy::wildcard_in_or_patterns)]
292
1950
            match self
293
1950
                .parser
294
1950
                .check_struct_type(NewtypeMode::InsideNewtype, TupleMode::DifferentiateNewtype)?
295
            {
296
                StructType::Named => {
297
                    // newtype variant wraps a named struct
298
                    // giving no name results in worse errors but is necessary here
299
278
                    return self.handle_struct_after_name("", visitor);
300
                }
301
                StructType::EmptyTuple | StructType::NonNewtypeTuple => {
302
                    // newtype variant wraps a tuple (struct)
303
                    // first argument is technically incorrect, but ignored anyway
304
278
                    return self.deserialize_tuple(0, visitor);
305
                }
306
                // StructType::Unit is impossible with NewtypeMode::InsideNewtype
307
                // StructType::AnyTuple is impossible with TupleMode::DifferentiateNewtype
308
1394
                StructType::NewtypeTuple | _ => {
309
1394
                    // continue as usual with the inner content of the newtype variant
310
1394
                    self.newtype_variant = false;
311
1394
                }
312
            }
313
393493
        }
314

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

            
335
        // `skip_identifier` does not change state if it fails
336
377105
        if let Some(ident) = self.parser.skip_identifier() {
337
11054
            self.parser.skip_ws()?;
338

            
339
11054
            return self.handle_any_struct(visitor, Some(ident));
340
366051
        }
341
366051

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

            
355
540
    fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
356
540
    where
357
540
        V: Visitor<'de>,
358
540
    {
359
540
        visitor.visit_bool(self.parser.bool()?)
360
540
    }
361

            
362
92
    fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value>
363
92
    where
364
92
        V: Visitor<'de>,
365
92
    {
366
92
        visitor.visit_i8(self.parser.integer()?)
367
92
    }
368

            
369
52
    fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value>
370
52
    where
371
52
        V: Visitor<'de>,
372
52
    {
373
52
        visitor.visit_i16(self.parser.integer()?)
374
52
    }
375

            
376
1068
    fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value>
377
1068
    where
378
1068
        V: Visitor<'de>,
379
1068
    {
380
1068
        visitor.visit_i32(self.parser.integer()?)
381
1068
    }
382

            
383
118
    fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value>
384
118
    where
385
118
        V: Visitor<'de>,
386
118
    {
387
118
        visitor.visit_i64(self.parser.integer()?)
388
118
    }
389

            
390
    #[cfg(feature = "integer128")]
391
32
    fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value>
392
32
    where
393
32
        V: Visitor<'de>,
394
32
    {
395
32
        visitor.visit_i128(self.parser.integer()?)
396
32
    }
397

            
398
23698
    fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value>
399
23698
    where
400
23698
        V: Visitor<'de>,
401
23698
    {
402
23698
        visitor.visit_u8(self.parser.integer()?)
403
23698
    }
404

            
405
56
    fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value>
406
56
    where
407
56
        V: Visitor<'de>,
408
56
    {
409
56
        visitor.visit_u16(self.parser.integer()?)
410
56
    }
411

            
412
464
    fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value>
413
464
    where
414
464
        V: Visitor<'de>,
415
464
    {
416
464
        visitor.visit_u32(self.parser.integer()?)
417
464
    }
418

            
419
58
    fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value>
420
58
    where
421
58
        V: Visitor<'de>,
422
58
    {
423
58
        visitor.visit_u64(self.parser.integer()?)
424
58
    }
425

            
426
    #[cfg(feature = "integer128")]
427
38
    fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value>
428
38
    where
429
38
        V: Visitor<'de>,
430
38
    {
431
38
        visitor.visit_u128(self.parser.integer()?)
432
38
    }
433

            
434
604
    fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value>
435
604
    where
436
604
        V: Visitor<'de>,
437
604
    {
438
604
        visitor.visit_f32(self.parser.float()?)
439
604
    }
440

            
441
248
    fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value>
442
248
    where
443
248
        V: Visitor<'de>,
444
248
    {
445
248
        visitor.visit_f64(self.parser.float()?)
446
248
    }
447

            
448
2400
    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
449
2400
    where
450
2400
        V: Visitor<'de>,
451
2400
    {
452
2400
        visitor.visit_char(self.parser.char()?)
453
2400
    }
454

            
455
6996
    fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
456
6996
    where
457
6996
        V: Visitor<'de>,
458
6996
    {
459
6996
        match self.parser.string()? {
460
104
            ParsedStr::Allocated(s) => visitor.visit_string(s),
461
6804
            ParsedStr::Slice(s) => visitor.visit_borrowed_str(s),
462
        }
463
6996
    }
464

            
465
6110
    fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
466
6110
    where
467
6110
        V: Visitor<'de>,
468
6110
    {
469
6110
        self.deserialize_str(visitor)
470
6110
    }
471

            
472
20
    fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
473
20
    where
474
20
        V: Visitor<'de>,
475
20
    {
476
20
        self.deserialize_byte_buf(visitor)
477
20
    }
478

            
479
2392
    fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
480
2392
    where
481
2392
        V: Visitor<'de>,
482
2392
    {
483
2392
        if self.parser.check_char('[') {
484
4
            let bytes = Vec::<u8>::deserialize(self)?;
485
4
            return visitor.visit_byte_buf(bytes);
486
2388
        }
487
2388

            
488
2388
        match self.parser.byte_string()? {
489
616
            ParsedByteStr::Allocated(byte_buf) => visitor.visit_byte_buf(byte_buf),
490
1724
            ParsedByteStr::Slice(bytes) => visitor.visit_borrowed_bytes(bytes),
491
        }
492
2392
    }
493

            
494
4432
    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
495
4432
    where
496
4432
        V: Visitor<'de>,
497
4432
    {
498
4432
        if self.parser.consume_ident("None") {
499
112
            visitor.visit_none()
500
4320
        } else if self.parser.consume_ident("Some") && {
501
4152
            self.parser.skip_ws()?;
502
4152
            self.parser.consume_char('(')
503
        } {
504
4152
            self.parser.skip_ws()?;
505

            
506
4152
            self.newtype_variant = self
507
4152
                .parser
508
4152
                .exts
509
4152
                .contains(Extensions::UNWRAP_VARIANT_NEWTYPES);
510

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

            
513
4148
            self.newtype_variant = false;
514
4148

            
515
4148
            self.parser.comma()?;
516

            
517
4148
            if self.parser.consume_char(')') {
518
3866
                Ok(v)
519
            } else {
520
282
                Err(Error::ExpectedOptionEnd)
521
            }
522
168
        } else if self.parser.exts.contains(Extensions::IMPLICIT_SOME) {
523
164
            guard_recursion! { self => visitor.visit_some(&mut *self) }
524
        } else {
525
4
            Err(Error::ExpectedOption)
526
        }
527
4432
    }
528

            
529
    // In Serde, unit means an anonymous value containing no data.
530
438
    fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
531
438
    where
532
438
        V: Visitor<'de>,
533
438
    {
534
438
        if self.newtype_variant || self.parser.consume_str("()") {
535
434
            self.newtype_variant = false;
536
434

            
537
434
            visitor.visit_unit()
538
        } else {
539
4
            Err(Error::ExpectedUnit)
540
        }
541
438
    }
542

            
543
160
    fn deserialize_unit_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
544
160
    where
545
160
        V: Visitor<'de>,
546
160
    {
547
160
        if self.newtype_variant || self.parser.consume_struct_name(name)? {
548
56
            self.newtype_variant = false;
549
56

            
550
56
            visitor.visit_unit()
551
        } else {
552
84
            self.deserialize_unit(visitor)
553
        }
554
160
    }
555

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

            
567
12312
            if self.parser.has_unclosed_line_comment() {
568
1112
                return Err(Error::UnclosedLineComment);
569
11200
            }
570
11200

            
571
11200
            let ron_str = &src_before[..src_before.len() - src_after.len()];
572
11200

            
573
11200
            return visitor
574
11200
                .visit_borrowed_str::<Error>(ron_str)
575
11200
                .map_err(|_| Error::ExpectedRawValue);
576
408
        }
577
408

            
578
408
        if self.parser.exts.contains(Extensions::UNWRAP_NEWTYPES) || self.newtype_variant {
579
96
            self.newtype_variant = false;
580
96

            
581
96
            return guard_recursion! { self => visitor.visit_newtype_struct(&mut *self) };
582
312
        }
583
312

            
584
312
        self.parser.consume_struct_name(name)?;
585

            
586
288
        self.parser.skip_ws()?;
587

            
588
288
        if self.parser.consume_char('(') {
589
264
            self.parser.skip_ws()?;
590
264
            let value = guard_recursion! { self => visitor.visit_newtype_struct(&mut *self)? };
591
264
            self.parser.comma()?;
592

            
593
264
            if self.parser.consume_char(')') {
594
260
                Ok(value)
595
            } else {
596
4
                Err(Error::ExpectedStructLikeEnd)
597
            }
598
24
        } else if name.is_empty() {
599
12
            Err(Error::ExpectedStructLike)
600
        } else {
601
12
            Err(Error::ExpectedNamedStructLike(name))
602
        }
603
13554
    }
604

            
605
7152
    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
606
7152
    where
607
7152
        V: Visitor<'de>,
608
7152
    {
609
7152
        self.newtype_variant = false;
610
7152

            
611
7152
        if self.parser.consume_char('[') {
612
7140
            let value = guard_recursion! { self =>
613
7140
                visitor.visit_seq(CommaSeparated::new(Terminator::Seq, self))?
614
            };
615
6854
            self.parser.skip_ws()?;
616

            
617
6854
            if self.parser.consume_char(']') {
618
6842
                Ok(value)
619
            } else {
620
12
                Err(Error::ExpectedArrayEnd)
621
            }
622
        } else {
623
12
            Err(Error::ExpectedArray)
624
        }
625
7152
    }
626

            
627
9174
    fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
628
9174
    where
629
9174
        V: Visitor<'de>,
630
9174
    {
631
9174
        if self.newtype_variant || self.parser.consume_char('(') {
632
9118
            let old_newtype_variant = self.newtype_variant;
633
9118
            self.newtype_variant = false;
634

            
635
9118
            let value = guard_recursion! { self =>
636
9118
                visitor.visit_seq(CommaSeparated::new(Terminator::Tuple, self))?
637
            };
638
8248
            self.parser.skip_ws()?;
639

            
640
8248
            if old_newtype_variant || self.parser.consume_char(')') {
641
8236
                Ok(value)
642
            } else {
643
12
                Err(Error::ExpectedStructLikeEnd)
644
            }
645
        } else {
646
56
            Err(Error::ExpectedStructLike)
647
        }
648
9174
    }
649

            
650
220
    fn deserialize_tuple_struct<V>(
651
220
        self,
652
220
        name: &'static str,
653
220
        len: usize,
654
220
        visitor: V,
655
220
    ) -> Result<V::Value>
656
220
    where
657
220
        V: Visitor<'de>,
658
220
    {
659
220
        if !self.newtype_variant {
660
204
            self.parser.consume_struct_name(name)?;
661
16
        }
662

            
663
196
        self.deserialize_tuple(len, visitor).map_err(|e| match e {
664
24
            Error::ExpectedStructLike if !name.is_empty() => Error::ExpectedNamedStructLike(name),
665
24
            e => e,
666
196
        })
667
220
    }
668

            
669
74402
    fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
670
74402
    where
671
74402
        V: Visitor<'de>,
672
74402
    {
673
        // Detect `#[serde(flatten)]` as a struct deserialised as a map
674
        const SERDE_FLATTEN_CANARY: &[u8] = b"struct ";
675

            
676
        struct VisitorExpecting<V>(V);
677
        impl<'de, V: Visitor<'de>> std::fmt::Display for VisitorExpecting<&'_ V> {
678
74402
            fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
679
74402
                self.0.expecting(fmt)
680
74402
            }
681
        }
682

            
683
74402
        self.newtype_variant = false;
684
74402

            
685
74402
        let mut canary_buffer = [0u8; SERDE_FLATTEN_CANARY.len()];
686
74402
        std::mem::drop(write!(
687
74402
            canary_buffer.as_mut(),
688
74402
            "{}",
689
74402
            VisitorExpecting(&visitor)
690
74402
        ));
691
74402
        let terminator = if canary_buffer == SERDE_FLATTEN_CANARY {
692
276
            Terminator::MapAsStruct
693
        } else {
694
74126
            Terminator::Map
695
        };
696

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

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

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

            
726
886
        self.parser.skip_ws()?;
727

            
728
886
        self.handle_struct_after_name(name, visitor)
729
922
    }
730

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

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

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

            
763
9084
        self.last_identifier = Some(identifier);
764
9084

            
765
9084
        visitor.visit_borrowed_str(identifier)
766
9152
    }
767

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

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

            
784
impl Terminator {
785
552325
    fn as_char(&self) -> char {
786
552325
        match self {
787
160210
            Terminator::Map | Terminator::MapAsStruct => '}',
788
347687
            Terminator::Tuple | Terminator::Struct => ')',
789
44428
            Terminator::Seq => ']',
790
        }
791
552325
    }
792
}
793

            
794
struct CommaSeparated<'a, 'de: 'a> {
795
    de: &'a mut Deserializer<'de>,
796
    terminator: Terminator,
797
    had_comma: bool,
798
    inside_internally_tagged_enum: bool,
799
}
800

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

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

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

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

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

            
838
29624
            self.had_comma = self.de.parser.comma()?;
839

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

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

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

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

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

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

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

            
893
10968
            self.had_comma = self.de.parser.comma()?;
894

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

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

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

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

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

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

            
924
978
        Ok((value, self))
925
1010
    }
926
}
927

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

            
931
16160
    fn unit_variant(self) -> Result<()> {
932
16160
        Ok(())
933
16160
    }
934

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

            
941
506
        self.de.parser.skip_ws()?;
942

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

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

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

            
958
372
            self.de.newtype_variant = false;
959
372

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

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

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

            
978
96
        self.de.deserialize_tuple(len, visitor)
979
96
    }
980

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

            
987
108
        self.de.parser.skip_ws()?;
988

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

            
995
38666
fn struct_error_name(error: Error, name: Option<&str>) -> Error {
996
2224
    match error {
997
        Error::NoSuchStructField {
998
2224
            expected,
999
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
    }
}