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
    value::NumberDeserializer,
21
};
22

            
23
#[cfg(feature = "std")]
24
use std::io;
25

            
26
mod id;
27
mod tag;
28
#[cfg(test)]
29
mod tests;
30
mod value;
31

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

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

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

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

            
64
561898
        deserializer.parser.exts |= options.default_extensions;
65

            
66
561898
        Ok(deserializer)
67
562728
    }
68

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

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

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

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

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

            
101
    #[must_use]
102
10010
    pub fn extensions(&self) -> Extensions {
103
10010
        self.parser.exts
104
10010
    }
105
}
106

            
107
/// A convenience function for building a deserializer
108
/// and deserializing a value of type `T` from a reader.
109
#[cfg(feature = "std")]
110
336
pub fn from_reader<R, T>(rdr: R) -> SpannedResult<T>
111
336
where
112
336
    R: io::Read,
113
336
    T: de::DeserializeOwned,
114
{
115
336
    Options::default().from_reader(rdr)
116
336
}
117

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

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

            
136
macro_rules! guard_recursion {
137
    ($self:expr => $expr:expr) => {{
138
        if let Some(limit) = &mut $self.recursion_limit {
139
            if let Some(new_limit) = limit.checked_sub(1) {
140
                *limit = new_limit;
141
            } else {
142
                return Err(Error::ExceededRecursionLimit);
143
            }
144
        }
145

            
146
        let result = $expr;
147

            
148
        if let Some(limit) = &mut $self.recursion_limit {
149
            *limit = limit.saturating_add(1);
150
        }
151

            
152
        result
153
    }};
154
}
155

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

            
162
453688
        if self.parser.src().is_empty() {
163
447102
            Ok(())
164
        } else {
165
6586
            Err(Error::TrailingCharacters)
166
        }
167
454260
    }
168

            
169
    /// Called from [`deserialize_any`][serde::Deserializer::deserialize_any]
170
    /// when a struct was detected. Decides if there is a unit, tuple or usual
171
    /// struct and deserializes it accordingly.
172
    ///
173
    /// This method assumes there is no identifier left.
174
21752
    fn handle_any_struct<V>(&mut self, visitor: V, ident: Option<&str>) -> Result<V::Value>
175
21752
    where
176
21752
        V: Visitor<'de>,
177
    {
178
        // HACK: switch to JSON enum semantics for JSON content
179
        // Robust impl blocked on https://github.com/serde-rs/serde/issues/1183
180
21752
        let is_serde_content =
181
21752
            is_serde_content::<V::Value>() || is_serde_tag_or_content::<V::Value>();
182

            
183
21752
        let old_serde_content_newtype = self.serde_content_newtype;
184
21752
        self.serde_content_newtype = false;
185

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

            
221
68
                result
222
            }
223
            (
224
                StructType::AnyTuple
225
                | StructType::EmptyTuple
226
                | StructType::NewtypeTuple
227
                | StructType::NonNewtypeTuple,
228
                _,
229
            ) => {
230
                // first argument is technically incorrect, but ignored anyway
231
8660
                self.deserialize_tuple(0, visitor)
232
            }
233
        }
234
21752
    }
235

            
236
277858
    fn handle_float_range_or_value<V>(
237
277858
        &mut self,
238
277858
        number: crate::value::Number,
239
277858
        visitor: V,
240
277858
    ) -> Result<V::Value>
241
277858
    where
242
277858
        V: Visitor<'de>,
243
    {
244
277858
        if self.parser.consume_str("..=") {
245
            let end = self.parser.any_number()?;
246
            return visitor.visit_map(RangeMapAccess::new(number, end, "end"));
247
277858
        } else if self.parser.consume_str("..") {
248
8
            if self
249
8
                .parser
250
8
                .peek_char()
251
8
                .map_or(true, |c| !self.parser.is_number_start(c))
252
            {
253
4
                return visitor.visit_map(RangeFromMapAccess::new(number));
254
4
            }
255
4
            let end = self.parser.any_number()?;
256
4
            return visitor.visit_map(RangeMapAccess::new(number, end, "end"));
257
277850
        }
258
277850
        number.visit(visitor)
259
277858
    }
260

            
261
    /// Called from
262
    /// [`deserialize_struct`][serde::Deserializer::deserialize_struct],
263
    /// [`struct_variant`][serde::de::VariantAccess::struct_variant], and
264
    /// [`handle_any_struct`][Self::handle_any_struct]. Handles
265
    /// deserialising the enclosing parentheses and everything in between.
266
    ///
267
    /// This method assumes there is no struct name identifier left.
268
5302
    fn handle_struct_after_name<V>(
269
5302
        &mut self,
270
5302
        name_for_pretty_errors_only: &'static str,
271
5302
        visitor: V,
272
5302
    ) -> Result<V::Value>
273
5302
    where
274
5302
        V: Visitor<'de>,
275
    {
276
5302
        if self.newtype_variant || self.parser.consume_char('(') {
277
5274
            let old_newtype_variant = self.newtype_variant;
278
5274
            self.newtype_variant = false;
279

            
280
5274
            let value = guard_recursion! { self =>
281
5274
                visitor
282
5274
                    .visit_map(CommaSeparated::new(Terminator::Struct, self))
283
5274
                    .map_err(|err| {
284
912
                        struct_error_name(
285
912
                            err,
286
912
                            if !old_newtype_variant && !name_for_pretty_errors_only.is_empty() {
287
238
                                Some(name_for_pretty_errors_only)
288
                            } else {
289
674
                                None
290
                            },
291
                        )
292
912
                    })?
293
            };
294

            
295
4362
            self.parser.skip_ws()?;
296

            
297
4362
            if old_newtype_variant || self.parser.consume_char(')') {
298
4350
                Ok(value)
299
            } else {
300
12
                Err(Error::ExpectedStructLikeEnd)
301
            }
302
28
        } else if name_for_pretty_errors_only.is_empty() {
303
4
            Err(Error::ExpectedStructLike)
304
        } else {
305
24
            Err(Error::ExpectedNamedStructLike(name_for_pretty_errors_only))
306
        }
307
5302
    }
308
}
309

            
310
impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
311
    type Error = Error;
312

            
313
407559
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
314
407559
    where
315
407559
        V: Visitor<'de>,
316
    {
317
407559
        if self.newtype_variant {
318
2292
            if self.parser.check_char(')') {
319
                // newtype variant wraps the unit type / a unit struct without name
320
286
                return self.deserialize_unit(visitor);
321
2006
            }
322

            
323
            #[allow(clippy::wildcard_in_or_patterns)]
324
2006
            match self
325
2006
                .parser
326
2006
                .check_struct_type(NewtypeMode::InsideNewtype, TupleMode::DifferentiateNewtype)?
327
            {
328
                StructType::Named => {
329
                    // newtype variant wraps a named struct
330
                    // giving no name results in worse errors but is necessary here
331
286
                    return self.handle_struct_after_name("", visitor);
332
                }
333
                StructType::EmptyTuple | StructType::NonNewtypeTuple => {
334
                    // newtype variant wraps a tuple (struct)
335
                    // first argument is technically incorrect, but ignored anyway
336
286
                    return self.deserialize_tuple(0, visitor);
337
                }
338
                // StructType::Unit is impossible with NewtypeMode::InsideNewtype
339
                // StructType::AnyTuple is impossible with TupleMode::DifferentiateNewtype
340
1434
                StructType::NewtypeTuple | _ => {
341
1434
                    // continue as usual with the inner content of the newtype variant
342
1434
                    self.newtype_variant = false;
343
1434
                }
344
            }
345
405267
        }
346

            
347
406701
        if self.parser.consume_ident("true") {
348
1485
            return visitor.visit_bool(true);
349
405216
        } else if self.parser.consume_ident("false") {
350
1445
            return visitor.visit_bool(false);
351
403771
        } else if self.parser.check_ident("Some") {
352
4084
            return self.deserialize_option(visitor);
353
399687
        } else if self.parser.consume_ident("None") {
354
7730
            return visitor.visit_none();
355
391957
        } else if self.parser.consume_str("()") {
356
672
            return visitor.visit_unit();
357
391285
        } else if self.parser.consume_ident("inf") || self.parser.consume_ident("inff32") {
358
866
            let number = crate::value::Number::F32(crate::value::F32(core::f32::INFINITY));
359
866
            return self.handle_float_range_or_value(number, visitor);
360
390419
        } else if self.parser.consume_ident("inff64") {
361
572
            let number = crate::value::Number::F64(crate::value::F64(core::f64::INFINITY));
362
572
            return self.handle_float_range_or_value(number, visitor);
363
389847
        } else if self.parser.consume_ident("NaN") || self.parser.consume_ident("NaNf32") {
364
866
            let number = crate::value::Number::F32(crate::value::F32(core::f32::NAN));
365
866
            return self.handle_float_range_or_value(number, visitor);
366
388981
        } else if self.parser.consume_ident("NaNf64") {
367
572
            let number = crate::value::Number::F64(crate::value::F64(core::f64::NAN));
368
572
            return self.handle_float_range_or_value(number, visitor);
369
388409
        }
370

            
371
        // `skip_identifier` does not change state if it fails
372
388409
        if let Some(ident) = self.parser.skip_identifier() {
373
11369
            self.parser.skip_ws()?;
374

            
375
11369
            return self.handle_any_struct(visitor, Some(ident));
376
377040
        }
377

            
378
377040
        match self.parser.peek_char_or_eof()? {
379
10383
            '(' => self.handle_any_struct(visitor, None),
380
1738
            '[' => self.deserialize_seq(visitor),
381
76110
            '{' => self.deserialize_map(visitor),
382
51151
            '0'..='9' | '+' | '-' | '.' | 'b' => {
383
279165
                if self.parser.check_char('b') && !self.parser.src().starts_with("b'") {
384
2304
                    return self.deserialize_byte_buf(visitor);
385
276861
                }
386

            
387
276861
                if self.parser.check_str("..=") {
388
                    self.parser.consume_str("..=");
389
                    let end = self.parser.any_number()?;
390
                    return visitor.visit_map(RangeToMapAccess::new(end, "end"));
391
276861
                }
392

            
393
276861
                if self.parser.check_str("..") {
394
592
                    let after_dots = &self.parser.src()[2..];
395
592
                    if after_dots.starts_with(|c: char| self.parser.is_number_start(c)) {
396
4
                        self.parser.consume_str("..");
397
4
                        let end = self.parser.any_number()?;
398
4
                        return visitor.visit_map(RangeToMapAccess::new(end, "end"));
399
588
                    }
400
588
                    self.parser.consume_str("..");
401
588
                    return visitor.visit_unit();
402
276269
                }
403

            
404
276269
                let start = self.parser.any_number()?;
405

            
406
274982
                self.handle_float_range_or_value(start, visitor)
407
            }
408
5894
            '"' | 'r' => self.deserialize_string(visitor),
409
1748
            '\'' => self.deserialize_char(visitor),
410
858
            other => Err(Error::UnexpectedChar(other)),
411
        }
412
407559
    }
413

            
414
576
    fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
415
576
    where
416
576
        V: Visitor<'de>,
417
    {
418
576
        visitor.visit_bool(self.parser.bool()?)
419
576
    }
420

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

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

            
435
1171
    fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value>
436
1171
    where
437
1171
        V: Visitor<'de>,
438
    {
439
1171
        visitor.visit_i32(self.parser.integer()?)
440
1171
    }
441

            
442
118
    fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value>
443
118
    where
444
118
        V: Visitor<'de>,
445
    {
446
118
        visitor.visit_i64(self.parser.integer()?)
447
118
    }
448

            
449
    #[cfg(feature = "integer128")]
450
32
    fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value>
451
32
    where
452
32
        V: Visitor<'de>,
453
    {
454
32
        visitor.visit_i128(self.parser.integer()?)
455
32
    }
456

            
457
20374
    fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value>
458
20374
    where
459
20374
        V: Visitor<'de>,
460
    {
461
20374
        visitor.visit_u8(self.parser.integer()?)
462
20374
    }
463

            
464
56
    fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value>
465
56
    where
466
56
        V: Visitor<'de>,
467
    {
468
56
        visitor.visit_u16(self.parser.integer()?)
469
56
    }
470

            
471
505
    fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value>
472
505
    where
473
505
        V: Visitor<'de>,
474
    {
475
505
        visitor.visit_u32(self.parser.integer()?)
476
505
    }
477

            
478
58
    fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value>
479
58
    where
480
58
        V: Visitor<'de>,
481
    {
482
58
        visitor.visit_u64(self.parser.integer()?)
483
58
    }
484

            
485
    #[cfg(feature = "integer128")]
486
38
    fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value>
487
38
    where
488
38
        V: Visitor<'de>,
489
    {
490
38
        visitor.visit_u128(self.parser.integer()?)
491
38
    }
492

            
493
657
    fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value>
494
657
    where
495
657
        V: Visitor<'de>,
496
    {
497
657
        visitor.visit_f32(self.parser.float()?)
498
657
    }
499

            
500
248
    fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value>
501
248
    where
502
248
        V: Visitor<'de>,
503
    {
504
248
        visitor.visit_f64(self.parser.float()?)
505
248
    }
506

            
507
2466
    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
508
2466
    where
509
2466
        V: Visitor<'de>,
510
    {
511
2466
        visitor.visit_char(self.parser.char()?)
512
2466
    }
513

            
514
7186
    fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
515
7186
    where
516
7186
        V: Visitor<'de>,
517
    {
518
7186
        match self.parser.string()? {
519
104
            ParsedStr::Allocated(s) => visitor.visit_string(s),
520
6991
            ParsedStr::Slice(s) => visitor.visit_borrowed_str(s),
521
        }
522
7186
    }
523

            
524
6313
    fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
525
6313
    where
526
6313
        V: Visitor<'de>,
527
    {
528
6313
        self.deserialize_str(visitor)
529
6313
    }
530

            
531
20
    fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
532
20
    where
533
20
        V: Visitor<'de>,
534
    {
535
20
        self.deserialize_byte_buf(visitor)
536
20
    }
537

            
538
2432
    fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
539
2432
    where
540
2432
        V: Visitor<'de>,
541
    {
542
2432
        if self.parser.check_char('[') {
543
4
            let bytes = Vec::<u8>::deserialize(self)?;
544
4
            return visitor.visit_byte_buf(bytes);
545
2428
        }
546

            
547
2428
        match self.parser.byte_string()? {
548
620
            ParsedByteStr::Allocated(byte_buf) => visitor.visit_byte_buf(byte_buf),
549
1772
            ParsedByteStr::Slice(bytes) => visitor.visit_borrowed_bytes(bytes),
550
        }
551
2432
    }
552

            
553
4544
    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
554
4544
    where
555
4544
        V: Visitor<'de>,
556
    {
557
4544
        if self.parser.consume_ident("None") {
558
112
            visitor.visit_none()
559
4432
        } else if self.parser.consume_ident("Some") && {
560
4264
            self.parser.skip_ws()?;
561
4264
            self.parser.consume_char('(')
562
        } {
563
4264
            self.parser.skip_ws()?;
564

            
565
4264
            self.newtype_variant = self
566
4264
                .parser
567
4264
                .exts
568
4264
                .contains(Extensions::UNWRAP_VARIANT_NEWTYPES);
569

            
570
4264
            let v = guard_recursion! { self => visitor.visit_some(&mut *self)? };
571

            
572
4260
            self.newtype_variant = false;
573

            
574
4260
            self.parser.comma()?;
575

            
576
4260
            if self.parser.consume_char(')') {
577
3970
                Ok(v)
578
            } else {
579
290
                Err(Error::ExpectedOptionEnd)
580
            }
581
168
        } else if self.parser.exts.contains(Extensions::IMPLICIT_SOME) {
582
164
            guard_recursion! { self => visitor.visit_some(&mut *self) }
583
        } else {
584
4
            Err(Error::ExpectedOption)
585
        }
586
4544
    }
587

            
588
    // In Serde, unit means an anonymous value containing no data.
589
450
    fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
590
450
    where
591
450
        V: Visitor<'de>,
592
    {
593
450
        if self.newtype_variant || self.parser.consume_str("()") {
594
446
            self.newtype_variant = false;
595

            
596
446
            visitor.visit_unit()
597
        } else {
598
4
            Err(Error::ExpectedUnit)
599
        }
600
450
    }
601

            
602
164
    fn deserialize_unit_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
603
164
    where
604
164
        V: Visitor<'de>,
605
    {
606
164
        if name == "RangeFull" && self.parser.consume_str("..") {
607
            return visitor.visit_unit();
608
164
        }
609

            
610
164
        if self.newtype_variant || self.parser.consume_struct_name(name)? {
611
56
            self.newtype_variant = false;
612

            
613
56
            visitor.visit_unit()
614
        } else {
615
88
            self.deserialize_unit(visitor)
616
        }
617
164
    }
618

            
619
13948
    fn deserialize_newtype_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
620
13948
    where
621
13948
        V: Visitor<'de>,
622
    {
623
13948
        if name == crate::value::raw::RAW_VALUE_TOKEN {
624
13522
            let src_before = self.parser.pre_ws_src();
625
13522
            self.parser.skip_ws()?;
626
13522
            let _ignored = self.deserialize_ignored_any(de::IgnoredAny)?;
627
12664
            self.parser.skip_ws()?;
628
12664
            let src_after = self.parser.src();
629

            
630
12664
            if self.parser.has_unclosed_line_comment() {
631
1144
                return Err(Error::UnclosedLineComment);
632
11520
            }
633

            
634
11520
            let ron_str = &src_before[..src_before.len() - src_after.len()];
635

            
636
11520
            return visitor
637
11520
                .visit_borrowed_str::<Error>(ron_str)
638
11520
                .map_err(|_| Error::ExpectedRawValue);
639
426
        }
640

            
641
426
        if self.parser.exts.contains(Extensions::UNWRAP_NEWTYPES) || self.newtype_variant {
642
108
            self.newtype_variant = false;
643

            
644
108
            return guard_recursion! { self => visitor.visit_newtype_struct(&mut *self) };
645
318
        }
646

            
647
318
        self.parser.consume_struct_name(name)?;
648

            
649
291
        self.parser.skip_ws()?;
650

            
651
291
        if self.parser.consume_char('(') {
652
264
            self.parser.skip_ws()?;
653
264
            let value = guard_recursion! { self => visitor.visit_newtype_struct(&mut *self)? };
654
264
            self.parser.comma()?;
655

            
656
264
            if self.parser.consume_char(')') {
657
260
                Ok(value)
658
            } else {
659
4
                Err(Error::ExpectedStructLikeEnd)
660
            }
661
27
        } else if name.is_empty() {
662
12
            Err(Error::ExpectedStructLike)
663
        } else {
664
15
            Err(Error::ExpectedNamedStructLike(name))
665
        }
666
13948
    }
667

            
668
5350
    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
669
5350
    where
670
5350
        V: Visitor<'de>,
671
    {
672
5350
        self.newtype_variant = false;
673

            
674
5350
        if self.parser.consume_char('[') {
675
5338
            let value = guard_recursion! { self =>
676
5338
                visitor.visit_seq(CommaSeparated::new(Terminator::Seq, self))?
677
            };
678
5044
            self.parser.skip_ws()?;
679

            
680
5044
            if self.parser.consume_char(']') {
681
5032
                Ok(value)
682
            } else {
683
12
                Err(Error::ExpectedArrayEnd)
684
            }
685
        } else {
686
12
            Err(Error::ExpectedArray)
687
        }
688
5350
    }
689

            
690
9428
    fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
691
9428
    where
692
9428
        V: Visitor<'de>,
693
    {
694
9428
        if self.newtype_variant || self.parser.consume_char('(') {
695
9372
            let old_newtype_variant = self.newtype_variant;
696
9372
            self.newtype_variant = false;
697

            
698
9372
            let value = guard_recursion! { self =>
699
9372
                visitor.visit_seq(CommaSeparated::new(Terminator::Tuple, self))?
700
            };
701
8472
            self.parser.skip_ws()?;
702

            
703
8472
            if old_newtype_variant || self.parser.consume_char(')') {
704
8460
                Ok(value)
705
            } else {
706
12
                Err(Error::ExpectedStructLikeEnd)
707
            }
708
        } else {
709
56
            Err(Error::ExpectedStructLike)
710
        }
711
9428
    }
712

            
713
223
    fn deserialize_tuple_struct<V>(
714
223
        self,
715
223
        name: &'static str,
716
223
        len: usize,
717
223
        visitor: V,
718
223
    ) -> Result<V::Value>
719
223
    where
720
223
        V: Visitor<'de>,
721
    {
722
223
        if !self.newtype_variant {
723
207
            self.parser.consume_struct_name(name)?;
724
16
        }
725

            
726
196
        self.deserialize_tuple(len, visitor).map_err(|e| match e {
727
24
            Error::ExpectedStructLike if !name.is_empty() => Error::ExpectedNamedStructLike(name),
728
24
            e => e,
729
36
        })
730
223
    }
731

            
732
76530
    fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
733
76530
    where
734
76530
        V: Visitor<'de>,
735
    {
736
        struct VisitorExpecting<V>(V);
737
        impl<'de, V: Visitor<'de>> core::fmt::Display for VisitorExpecting<&'_ V> {
738
76530
            fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result {
739
76530
                self.0.expecting(fmt)
740
76530
            }
741
        }
742

            
743
76530
        self.newtype_variant = false;
744

            
745
        // TODO: Avoid allocating to perform this check.
746
76530
        let serde_flatten_canary = VisitorExpecting(&visitor)
747
76530
            .to_string()
748
76530
            .starts_with("struct ");
749

            
750
76530
        let terminator = if serde_flatten_canary {
751
276
            Terminator::MapAsStruct
752
        } else {
753
76254
            Terminator::Map
754
        };
755

            
756
76530
        if self.parser.consume_char('{') {
757
76518
            let value = guard_recursion! { self =>
758
75374
                visitor.visit_map(CommaSeparated::new(terminator, self))?
759
            };
760
2538
            self.parser.skip_ws()?;
761

            
762
2538
            if self.parser.consume_char('}') {
763
2526
                Ok(value)
764
            } else {
765
12
                Err(Error::ExpectedMapEnd)
766
            }
767
        } else {
768
12
            Err(Error::ExpectedMap)
769
        }
770
76530
    }
771

            
772
1023
    fn deserialize_struct<V>(
773
1023
        self,
774
1023
        name: &'static str,
775
1023
        fields: &'static [&'static str],
776
1023
        visitor: V,
777
1023
    ) -> Result<V::Value>
778
1023
    where
779
1023
        V: Visitor<'de>,
780
    {
781
        // `RangeInclusive` used `last` as field name before it was renamed to `end` in a newer Rust version
782
1023
        if (name == "Range" && fields == ["start", "end"])
783
987
            || (name == "RangeInclusive" && matches!(fields, ["start", "end" | "last"]))
784
        {
785
52
            let end_field = fields[1];
786
52
            if let Some(c) = self.parser.peek_char() {
787
52
                if self.parser.is_number_start(c) {
788
20
                    let start = self.parser.any_number()?;
789

            
790
20
                    let inclusive = if self.parser.consume_str("..=") {
791
4
                        true
792
16
                    } else if self.parser.consume_str("..") {
793
16
                        false
794
                    } else {
795
                        return Err(Error::ExpectedRangeSyntax);
796
                    };
797

            
798
20
                    if inclusive && name == "Range" {
799
                        return Err(Error::Message(String::from(
800
                            "expected `..` for `Range`, found `..=`",
801
                        )));
802
20
                    }
803
20
                    if !inclusive && name == "RangeInclusive" {
804
                        return Err(Error::Message(String::from(
805
                            "expected `..=` for `RangeInclusive`, found `..`",
806
                        )));
807
20
                    }
808

            
809
20
                    let end = self.parser.any_number()?;
810
20
                    return visitor.visit_map(RangeMapAccess::new(start, end, end_field));
811
32
                }
812
            }
813
971
        }
814

            
815
1003
        if fields == ["start"] && name == "RangeFrom" {
816
28
            if let Some(c) = self.parser.peek_char() {
817
28
                if self.parser.is_number_start(c)
818
24
                    || self.parser.check_ident("inf")
819
24
                    || self.parser.check_ident("inff32")
820
20
                    || self.parser.check_ident("inff64")
821
16
                    || self.parser.check_ident("NaN")
822
16
                    || self.parser.check_ident("NaNf32")
823
12
                    || self.parser.check_ident("NaNf64")
824
                {
825
20
                    let start = self.parser.any_number()?;
826
20
                    if self.parser.consume_str("..=") {
827
                        return Err(Error::Message(String::from(
828
                            "expected `..` for `RangeFrom`, found `..=`",
829
                        )));
830
20
                    } else if !self.parser.consume_str("..") {
831
                        return Err(Error::ExpectedRangeSyntax);
832
20
                    }
833
20
                    return visitor.visit_map(RangeFromMapAccess::new(start));
834
8
                }
835
            }
836
975
        }
837

            
838
983
        if fields == ["end"]
839
20
            && name == "RangeTo"
840
12
            && (self.parser.check_str("..=") || self.parser.check_str(".."))
841
        {
842
4
            if self.parser.consume_str("..=") {
843
                return Err(Error::Message(String::from(
844
                    "expected `..` for `RangeTo`, found `..=`",
845
                )));
846
4
            }
847
4
            self.parser.consume_str("..");
848
4
            let end = self.parser.any_number()?;
849
4
            return visitor.visit_map(RangeToMapAccess::new(end, "end"));
850
979
        }
851

            
852
        // `last` is the old field name for `RangeToInclusive`, replaced by `end` in a newer Rust version
853
979
        if matches!(fields, ["end" | "last"])
854
16
            && name == "RangeToInclusive"
855
8
            && (self.parser.check_str("..=") || self.parser.check_str(".."))
856
        {
857
            if !self.parser.consume_str("..=") {
858
                self.parser.consume_str("..");
859
                return Err(Error::Message(String::from(
860
                    "expected `..=` for `RangeToInclusive`, found `..`",
861
                )));
862
            }
863
            let end = self.parser.any_number()?;
864
            return visitor.visit_map(RangeToMapAccess::new(end, fields[0]));
865
979
        }
866

            
867
979
        if !self.newtype_variant {
868
914
            self.parser.consume_struct_name(name)?;
869
65
        }
870

            
871
943
        self.parser.skip_ws()?;
872

            
873
943
        self.handle_struct_after_name(name, visitor)
874
1023
    }
875

            
876
1049
    fn deserialize_enum<V>(
877
1049
        self,
878
1049
        name: &'static str,
879
1049
        _variants: &'static [&'static str],
880
1049
        visitor: V,
881
1049
    ) -> Result<V::Value>
882
1049
    where
883
1049
        V: Visitor<'de>,
884
    {
885
1049
        self.newtype_variant = false;
886

            
887
1049
        match guard_recursion! { self => visitor.visit_enum(Enum::new(self)) } {
888
784
            Ok(value) => Ok(value),
889
            Err(Error::NoSuchEnumVariant {
890
18
                expected,
891
18
                found,
892
                outer: None,
893
18
            }) if !name.is_empty() => Err(Error::NoSuchEnumVariant {
894
18
                expected,
895
18
                found,
896
18
                outer: Some(String::from(name)),
897
18
            }),
898
247
            Err(e) => Err(e),
899
        }
900
1049
    }
901

            
902
9421
    fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
903
9421
    where
904
9421
        V: Visitor<'de>,
905
    {
906
9421
        let identifier = self.parser.identifier()?;
907

            
908
9353
        self.last_identifier = Some(identifier);
909

            
910
9353
        visitor.visit_borrowed_str(identifier)
911
9421
    }
912

            
913
56628
    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
914
56628
    where
915
56628
        V: Visitor<'de>,
916
    {
917
56628
        self.deserialize_any(visitor)
918
56628
    }
919
}
920

            
921
enum Terminator {
922
    Map,
923
    MapAsStruct,
924
    Tuple,
925
    Struct,
926
    Seq,
927
}
928

            
929
impl Terminator {
930
570708
    fn as_char(&self) -> char {
931
570708
        match self {
932
164818
            Terminator::Map | Terminator::MapAsStruct => '}',
933
366196
            Terminator::Tuple | Terminator::Struct => ')',
934
39694
            Terminator::Seq => ']',
935
        }
936
570708
    }
937
}
938

            
939
struct CommaSeparated<'a, 'de: 'a> {
940
    de: &'a mut Deserializer<'de>,
941
    terminator: Terminator,
942
    had_comma: bool,
943
    inside_internally_tagged_enum: bool,
944
}
945

            
946
impl<'a, 'de> CommaSeparated<'a, 'de> {
947
257742
    fn new(terminator: Terminator, de: &'a mut Deserializer<'de>) -> Self {
948
257742
        CommaSeparated {
949
257742
            de,
950
257742
            terminator,
951
257742
            had_comma: true,
952
257742
            inside_internally_tagged_enum: false,
953
257742
        }
954
257742
    }
955

            
956
570708
    fn has_element(&mut self) -> Result<bool> {
957
570708
        self.de.parser.skip_ws()?;
958

            
959
570708
        match (
960
570708
            self.had_comma,
961
570708
            !self.de.parser.check_char(self.terminator.as_char()),
962
570708
        ) {
963
            // Trailing comma, maybe has a next element
964
499087
            (true, has_element) => Ok(has_element),
965
            // No trailing comma but terminator
966
70477
            (false, false) => Ok(false),
967
            // No trailing comma or terminator
968
1144
            (false, true) => Err(Error::ExpectedComma),
969
        }
970
570708
    }
971
}
972

            
973
enum RangeMapState {
974
    StartKey,
975
    StartValue,
976
    EndKey,
977
    EndValue,
978
    Done,
979
}
980

            
981
struct RangeMapAccess {
982
    start: crate::value::Number,
983
    end: crate::value::Number,
984
    state: RangeMapState,
985
    end_key: &'static str,
986
}
987

            
988
impl RangeMapAccess {
989
1716
    fn new(start: crate::value::Number, end: crate::value::Number, end_key: &'static str) -> Self {
990
1716
        RangeMapAccess {
991
1716
            start,
992
1716
            end,
993
1716
            state: RangeMapState::StartKey,
994
1716
            end_key,
995
1716
        }
996
1716
    }
997
}
998

            
999
impl<'de> de::MapAccess<'de> for RangeMapAccess {
    type Error = Error;
72
    fn next_key_seed<K: de::DeserializeSeed<'de>>(&mut self, seed: K) -> Result<Option<K::Value>> {
72
        match self.state {
            RangeMapState::StartKey => {
24
                self.state = RangeMapState::StartValue;
24
                seed.deserialize(de::value::StrDeserializer::<Error>::new("start"))
24
                    .map(Some)
            }
            RangeMapState::EndKey => {
24
                self.state = RangeMapState::EndValue;
24
                seed.deserialize(de::value::StrDeserializer::<Error>::new(self.end_key))
24
                    .map(Some)
            }
24
            _ => Ok(None),
        }
72
    }
48
    fn next_value_seed<V: de::DeserializeSeed<'de>>(&mut self, seed: V) -> Result<V::Value> {
48
        match self.state {
            RangeMapState::StartValue => {
24
                self.state = RangeMapState::EndKey;
24
                seed.deserialize(NumberDeserializer(self.start))
            }
            RangeMapState::EndValue => {
24
                self.state = RangeMapState::Done;
24
                seed.deserialize(NumberDeserializer(self.end))
            }
            _ => Err(Error::ExpectedDifferentLength {
                expected: String::from("map of length 2"),
                found: 3,
            }),
        }
48
    }
}
struct RangeFromMapAccess {
    start: crate::value::Number,
    done: bool,
}
impl RangeFromMapAccess {
1716
    fn new(start: crate::value::Number) -> Self {
1716
        RangeFromMapAccess { start, done: false }
1716
    }
}
impl<'de> de::MapAccess<'de> for RangeFromMapAccess {
    type Error = Error;
48
    fn next_key_seed<K: de::DeserializeSeed<'de>>(&mut self, seed: K) -> Result<Option<K::Value>> {
48
        if self.done {
24
            return Ok(None);
24
        }
24
        seed.deserialize(de::value::StrDeserializer::<Error>::new("start"))
24
            .map(Some)
48
    }
24
    fn next_value_seed<V: de::DeserializeSeed<'de>>(&mut self, seed: V) -> Result<V::Value> {
24
        if self.done {
            return Err(Error::ExpectedDifferentLength {
                expected: String::from("map of length 1"),
                found: 2,
            });
24
        }
24
        self.done = true;
24
        seed.deserialize(NumberDeserializer(self.start))
24
    }
}
struct RangeToMapAccess {
    end: crate::value::Number,
    end_key: &'static str,
    done: bool,
}
impl RangeToMapAccess {
572
    fn new(end: crate::value::Number, end_key: &'static str) -> Self {
572
        RangeToMapAccess {
572
            end,
572
            end_key,
572
            done: false,
572
        }
572
    }
}
impl<'de> de::MapAccess<'de> for RangeToMapAccess {
    type Error = Error;
16
    fn next_key_seed<K: de::DeserializeSeed<'de>>(&mut self, seed: K) -> Result<Option<K::Value>> {
16
        if self.done {
8
            return Ok(None);
8
        }
8
        seed.deserialize(de::value::StrDeserializer::<Error>::new(self.end_key))
8
            .map(Some)
16
    }
8
    fn next_value_seed<V: de::DeserializeSeed<'de>>(&mut self, seed: V) -> Result<V::Value> {
8
        if self.done {
            return Err(Error::ExpectedDifferentLength {
                expected: String::from("map of length 1"),
                found: 2,
            });
8
        }
8
        self.done = true;
8
        seed.deserialize(NumberDeserializer(self.end))
8
    }
}
impl<'de, 'a> de::SeqAccess<'de> for CommaSeparated<'a, 'de> {
    type Error = Error;
40752
    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
40752
    where
40752
        T: DeserializeSeed<'de>,
    {
40752
        if self.has_element()? {
27621
            let res = guard_recursion! { self.de => seed.deserialize(&mut *self.de)? };
26442
            self.had_comma = self.de.parser.comma()?;
26442
            Ok(Some(res))
        } else {
13123
            Ok(None)
        }
40752
    }
}
impl<'de, 'a> de::MapAccess<'de> for CommaSeparated<'a, 'de> {
    type Error = Error;
91377
    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
91377
    where
91377
        K: DeserializeSeed<'de>,
    {
91377
        if self.has_element()? {
84336
            self.inside_internally_tagged_enum = is_serde_tag_or_content::<K::Value>();
84336
            match self.terminator {
8472
                Terminator::Struct => guard_recursion! { self.de =>
8472
                    seed.deserialize(&mut id::Deserializer::new(&mut *self.de, false)).map(Some)
                },
612
                Terminator::MapAsStruct => guard_recursion! { self.de =>
612
                    seed.deserialize(&mut id::Deserializer::new(&mut *self.de, true)).map(Some)
                },
75252
                _ => guard_recursion! { self.de => seed.deserialize(&mut *self.de).map(Some) },
            }
        } else {
7033
            Ok(None)
        }
91377
    }
12286
    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
12286
    where
12286
        V: DeserializeSeed<'de>,
    {
12286
        self.de.parser.skip_ws()?;
12286
        if self.de.parser.consume_char(':') {
11992
            self.de.parser.skip_ws()?;
11992
            let res = if self.inside_internally_tagged_enum && !is_serde_content::<V::Value>() {
101
                guard_recursion! { self.de =>
101
                    seed.deserialize(&mut tag::Deserializer::new(&mut *self.de))?
                }
            } else {
11891
                guard_recursion! { self.de =>
11891
                    seed.deserialize(&mut *self.de)?
                }
            };
11345
            self.had_comma = self.de.parser.comma()?;
11345
            Ok(res)
        } else {
294
            Err(Error::ExpectedMapColon)
        }
12286
    }
}
struct Enum<'a, 'de: 'a> {
    de: &'a mut Deserializer<'de>,
}
impl<'a, 'de> Enum<'a, 'de> {
67409
    fn new(de: &'a mut Deserializer<'de>) -> Self {
67409
        Enum { de }
67409
    }
}
impl<'de, 'a> de::EnumAccess<'de> for Enum<'a, 'de> {
    type Error = Error;
    type Variant = Self;
1049
    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)>
1049
    where
1049
        V: DeserializeSeed<'de>,
    {
1049
        self.de.parser.skip_ws()?;
1049
        let value = guard_recursion! { self.de => seed.deserialize(&mut *self.de)? };
1011
        Ok((value, self))
1049
    }
}
impl<'de, 'a> de::VariantAccess<'de> for Enum<'a, 'de> {
    type Error = Error;
16624
    fn unit_variant(self) -> Result<()> {
16624
        Ok(())
16624
    }
515
    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
515
    where
515
        T: DeserializeSeed<'de>,
    {
515
        let newtype_variant = self.de.last_identifier;
515
        self.de.parser.skip_ws()?;
515
        if self.de.parser.consume_char('(') {
503
            self.de.parser.skip_ws()?;
503
            self.de.newtype_variant = self
503
                .de
503
                .parser
503
                .exts
503
                .contains(Extensions::UNWRAP_VARIANT_NEWTYPES);
503
            let val = guard_recursion! { self.de =>
503
                seed
503
                    .deserialize(&mut *self.de)
503
                    .map_err(|err| struct_error_name(err, newtype_variant))?
            };
372
            self.de.newtype_variant = false;
372
            self.de.parser.comma()?;
372
            if self.de.parser.consume_char(')') {
360
                Ok(val)
            } else {
12
                Err(Error::ExpectedStructLikeEnd)
            }
        } else {
12
            Err(Error::ExpectedStructLike)
        }
515
    }
99
    fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value>
99
    where
99
        V: Visitor<'de>,
    {
99
        self.de.parser.skip_ws()?;
99
        self.de.deserialize_tuple(len, visitor)
99
    }
129
    fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value>
129
    where
129
        V: Visitor<'de>,
    {
129
        let struct_variant = self.de.last_identifier;
129
        self.de.parser.skip_ws()?;
129
        self.de
129
            .handle_struct_after_name("", visitor)
129
            .map_err(|err| struct_error_name(err, struct_variant))
129
    }
}
36242
fn struct_error_name(error: Error, name: Option<&str>) -> Error {
3800
    match error {
        Error::NoSuchStructField {
3800
            expected,
3800
            found,
            outer: None,
3800
        } => Error::NoSuchStructField {
3800
            expected,
3800
            found,
3800
            outer: name.map(ToOwned::to_owned),
3800
        },
4442
        Error::MissingStructField { field, outer: None } => Error::MissingStructField {
4442
            field,
4442
            outer: name.map(ToOwned::to_owned),
4442
        },
3800
        Error::DuplicateStructField { field, outer: None } => Error::DuplicateStructField {
3800
            field,
3800
            outer: name.map(ToOwned::to_owned),
3800
        },
24200
        e => e,
    }
36242
}
struct SerdeEnumContent<'a, 'de: 'a> {
    de: &'a mut Deserializer<'de>,
    ident: Option<&'a str>,
}
impl<'de, 'a> de::MapAccess<'de> for SerdeEnumContent<'a, 'de> {
    type Error = Error;
263
    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
263
    where
263
        K: DeserializeSeed<'de>,
    {
263
        self.ident
263
            .take()
263
            .map(|ident| seed.deserialize(de::value::StrDeserializer::new(ident)))
263
            .transpose()
263
    }
139
    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
139
    where
139
        V: DeserializeSeed<'de>,
    {
139
        self.de.parser.skip_ws()?;
139
        let old_serde_content_newtype = self.de.serde_content_newtype;
139
        self.de.serde_content_newtype = true;
139
        let result = seed.deserialize(&mut *self.de);
139
        self.de.serde_content_newtype = old_serde_content_newtype;
139
        result
139
    }
}
22017
fn is_serde_content<T>() -> bool {
    #[derive(serde_derive::Deserialize)]
    enum A {}
    type B = A;
    #[derive(serde_derive::Deserialize)]
    #[serde(untagged)]
    enum UntaggedEnum {
        A(A),
        B(B),
    }
    struct TypeIdDeserializer;
    impl<'de> de::Deserializer<'de> for TypeIdDeserializer {
        type Error = TypeIdError;
8156
        fn deserialize_any<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value, Self::Error> {
8156
            Err(TypeIdError(typeid::of::<V::Value>()))
8156
        }
        serde::forward_to_deserialize_any! {
            bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
            bytes byte_buf option unit unit_struct newtype_struct seq tuple
            tuple_struct map struct enum identifier ignored_any
        }
    }
    #[derive(Debug)]
    struct TypeIdError(core::any::TypeId);
    impl core::fmt::Display for TypeIdError {
        fn fmt(&self, _fmt: &mut core::fmt::Formatter) -> core::fmt::Result {
            Ok(())
        }
    }
    impl de::Error for TypeIdError {
        #[allow(clippy::unreachable)]
        fn custom<T: core::fmt::Display>(_msg: T) -> Self {
            unreachable!()
        }
    }
    impl de::StdError for TypeIdError {}
96963
    fn type_id_of_untagged_enum_default_buffer() -> core::any::TypeId {
        static TYPE_ID: once_cell::race::OnceBox<core::any::TypeId> =
            once_cell::race::OnceBox::new();
96963
        *TYPE_ID.get_or_init(|| match Deserialize::deserialize(TypeIdDeserializer) {
            Ok(UntaggedEnum::A(void) | UntaggedEnum::B(void)) => match void {},
8156
            Err(TypeIdError(typeid)) => alloc::boxed::Box::new(typeid),
8156
        })
96963
    }
22017
    typeid::of::<T>() == type_id_of_untagged_enum_default_buffer()
22017
}
105457
fn is_serde_tag_or_content<T>() -> bool {
    #[derive(serde_derive::Deserialize)]
    enum A {}
    #[derive(serde_derive::Deserialize)]
    #[serde(tag = "tag")]
    enum InternallyTaggedEnum {
        A { a: A },
    }
    struct TypeIdDeserializer;
    impl<'de> de::Deserializer<'de> for TypeIdDeserializer {
        type Error = TypeIdError;
14875
        fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
14875
        where
14875
            V: Visitor<'de>,
        {
14875
            visitor.visit_map(self)
14875
        }
        serde::forward_to_deserialize_any! {
            bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
            bytes byte_buf option unit unit_struct newtype_struct seq tuple
            tuple_struct map struct enum identifier ignored_any
        }
    }
    impl<'de> de::MapAccess<'de> for TypeIdDeserializer {
        type Error = TypeIdError;
14875
        fn next_key_seed<K: DeserializeSeed<'de>>(
14875
            &mut self,
14875
            _seed: K,
14875
        ) -> Result<Option<K::Value>, Self::Error> {
14875
            Err(TypeIdError(typeid::of::<K::Value>()))
14875
        }
        #[allow(clippy::unreachable)]
        fn next_value_seed<V: DeserializeSeed<'de>>(
            &mut self,
            _seed: V,
        ) -> Result<V::Value, Self::Error> {
            unreachable!()
        }
    }
    #[derive(Debug)]
    struct TypeIdError(core::any::TypeId);
    impl core::fmt::Display for TypeIdError {
        fn fmt(&self, _fmt: &mut core::fmt::Formatter) -> core::fmt::Result {
            Ok(())
        }
    }
    impl de::Error for TypeIdError {
        #[allow(clippy::unreachable)]
        fn custom<T: core::fmt::Display>(_msg: T) -> Self {
            unreachable!()
        }
    }
    impl de::StdError for TypeIdError {}
378211
    fn type_id_of_internally_tagged_enum_default_tag_or_buffer() -> core::any::TypeId {
        static TYPE_ID: once_cell::race::OnceBox<core::any::TypeId> =
            once_cell::race::OnceBox::new();
378211
        *TYPE_ID.get_or_init(|| match Deserialize::deserialize(TypeIdDeserializer) {
            Ok(InternallyTaggedEnum::A { a: void }) => match void {},
14875
            Err(TypeIdError(typeid)) => alloc::boxed::Box::new(typeid),
14875
        })
378211
    }
105457
    typeid::of::<T>() == type_id_of_internally_tagged_enum_default_tag_or_buffer()
105457
}