1use alloc::{
3 borrow::ToOwned,
4 string::{String, ToString},
5 vec::Vec,
6};
7use core::str;
8
9use serde::{
10 de::{self, DeserializeSeed, Deserializer as _, Visitor},
11 Deserialize,
12};
13
14pub use crate::error::{Error, Position, Span, SpannedError};
15use crate::{
16 error::{Result, SpannedResult},
17 extensions::Extensions,
18 options::Options,
19 parse::{NewtypeMode, ParsedByteStr, ParsedStr, Parser, StructType, TupleMode},
20};
21
22#[cfg(feature = "std")]
23use std::io;
24
25mod id;
26mod tag;
27#[cfg(test)]
28mod tests;
29mod value;
30
31pub struct Deserializer<'de> {
36 pub(crate) parser: Parser<'de>,
37 newtype_variant: bool,
38 serde_content_newtype: bool,
39 last_identifier: Option<&'de str>,
40 recursion_limit: Option<usize>,
41}
42
43impl<'de> Deserializer<'de> {
44 #[allow(clippy::should_implement_trait)]
46 pub fn from_str(input: &'de str) -> SpannedResult<Self> {
47 Self::from_str_with_options(input, &Options::default())
48 }
49
50 pub fn from_bytes(input: &'de [u8]) -> SpannedResult<Self> {
51 Self::from_bytes_with_options(input, &Options::default())
52 }
53
54 pub fn from_str_with_options(input: &'de str, options: &Options) -> SpannedResult<Self> {
55 let mut deserializer = Deserializer {
56 parser: Parser::new(input)?,
57 newtype_variant: false,
58 serde_content_newtype: false,
59 last_identifier: None,
60 recursion_limit: options.recursion_limit,
61 };
62
63 deserializer.parser.exts |= options.default_extensions;
64
65 Ok(deserializer)
66 }
67
68 #[allow(clippy::missing_panics_doc)]
70 pub fn from_bytes_with_options(input: &'de [u8], options: &Options) -> SpannedResult<Self> {
71 let err = match str::from_utf8(input) {
72 Ok(input) => return Self::from_str_with_options(input, options),
73 Err(err) => err,
74 };
75
76 #[allow(clippy::expect_used)]
78 let valid_input =
79 str::from_utf8(&input[..err.valid_up_to()]).expect("source is valid up to error");
80
81 Err(SpannedError {
82 code: err.into(),
83 span: Span {
84 start: Position { line: 1, col: 1 },
85 end: Position::from_src_end(valid_input),
86 },
87 })
88 }
89
90 #[must_use]
91 pub fn remainder(&self) -> &'de str {
92 self.parser.src()
93 }
94
95 #[must_use]
96 pub fn span_error(&self, code: Error) -> SpannedError {
97 self.parser.span_error(code)
98 }
99
100 #[must_use]
101 pub fn extensions(&self) -> Extensions {
102 self.parser.exts
103 }
104}
105
106#[cfg(feature = "std")]
109pub fn from_reader<R, T>(rdr: R) -> SpannedResult<T>
110where
111 R: io::Read,
112 T: de::DeserializeOwned,
113{
114 Options::default().from_reader(rdr)
115}
116
117pub fn from_str<'a, T>(s: &'a str) -> SpannedResult<T>
120where
121 T: de::Deserialize<'a>,
122{
123 Options::default().from_str(s)
124}
125
126pub fn from_bytes<'a, T>(s: &'a [u8]) -> SpannedResult<T>
129where
130 T: de::Deserialize<'a>,
131{
132 Options::default().from_bytes(s)
133}
134
135macro_rules! guard_recursion {
136 ($self:expr => $expr:expr) => {{
137 if let Some(limit) = &mut $self.recursion_limit {
138 if let Some(new_limit) = limit.checked_sub(1) {
139 *limit = new_limit;
140 } else {
141 return Err(Error::ExceededRecursionLimit);
142 }
143 }
144
145 let result = $expr;
146
147 if let Some(limit) = &mut $self.recursion_limit {
148 *limit = limit.saturating_add(1);
149 }
150
151 result
152 }};
153}
154
155impl<'de> Deserializer<'de> {
156 pub fn end(&mut self) -> Result<()> {
159 self.parser.skip_ws()?;
160
161 if self.parser.src().is_empty() {
162 Ok(())
163 } else {
164 Err(Error::TrailingCharacters)
165 }
166 }
167
168 fn handle_any_struct<V>(&mut self, visitor: V, ident: Option<&str>) -> Result<V::Value>
174 where
175 V: Visitor<'de>,
176 {
177 let is_serde_content =
180 is_serde_content::<V::Value>() || is_serde_tag_or_content::<V::Value>();
181
182 let old_serde_content_newtype = self.serde_content_newtype;
183 self.serde_content_newtype = false;
184
185 match (
186 self.parser.check_struct_type(
187 NewtypeMode::NoParensMeanUnit,
188 if old_serde_content_newtype {
189 TupleMode::DifferentiateNewtype } else {
191 TupleMode::ImpreciseTupleOrNewtype },
193 )?,
194 ident,
195 ) {
196 (StructType::Unit, Some(ident)) if is_serde_content => {
197 visitor.visit_str(ident)
199 }
200 (StructType::Unit, _) => visitor.visit_unit(),
201 (_, Some(ident)) if is_serde_content => {
202 visitor.visit_map(SerdeEnumContent {
204 de: self,
205 ident: Some(ident),
206 })
207 }
208 (StructType::Named, _) => {
209 self.handle_struct_after_name("", visitor)
211 }
212 (StructType::NewtypeTuple, _) if old_serde_content_newtype => {
213 self.parser.consume_char('(');
215 self.parser.skip_ws()?;
216 let result = self.deserialize_any(visitor);
217 self.parser.skip_ws()?;
218 self.parser.consume_char(')');
219
220 result
221 }
222 (
223 StructType::AnyTuple
224 | StructType::EmptyTuple
225 | StructType::NewtypeTuple
226 | StructType::NonNewtypeTuple,
227 _,
228 ) => {
229 self.deserialize_tuple(0, visitor)
231 }
232 }
233 }
234
235 fn handle_struct_after_name<V>(
243 &mut self,
244 name_for_pretty_errors_only: &'static str,
245 visitor: V,
246 ) -> Result<V::Value>
247 where
248 V: Visitor<'de>,
249 {
250 if self.newtype_variant || self.parser.consume_char('(') {
251 let old_newtype_variant = self.newtype_variant;
252 self.newtype_variant = false;
253
254 let value = guard_recursion! { self =>
255 visitor
256 .visit_map(CommaSeparated::new(Terminator::Struct, self))
257 .map_err(|err| {
258 struct_error_name(
259 err,
260 if !old_newtype_variant && !name_for_pretty_errors_only.is_empty() {
261 Some(name_for_pretty_errors_only)
262 } else {
263 None
264 },
265 )
266 })?
267 };
268
269 self.parser.skip_ws()?;
270
271 if old_newtype_variant || self.parser.consume_char(')') {
272 Ok(value)
273 } else {
274 Err(Error::ExpectedStructLikeEnd)
275 }
276 } else if name_for_pretty_errors_only.is_empty() {
277 Err(Error::ExpectedStructLike)
278 } else {
279 Err(Error::ExpectedNamedStructLike(name_for_pretty_errors_only))
280 }
281 }
282}
283
284impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
285 type Error = Error;
286
287 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
288 where
289 V: Visitor<'de>,
290 {
291 if self.newtype_variant {
292 if self.parser.check_char(')') {
293 return self.deserialize_unit(visitor);
295 }
296
297 #[allow(clippy::wildcard_in_or_patterns)]
298 match self
299 .parser
300 .check_struct_type(NewtypeMode::InsideNewtype, TupleMode::DifferentiateNewtype)?
301 {
302 StructType::Named => {
303 return self.handle_struct_after_name("", visitor);
306 }
307 StructType::EmptyTuple | StructType::NonNewtypeTuple => {
308 return self.deserialize_tuple(0, visitor);
311 }
312 StructType::NewtypeTuple | _ => {
315 self.newtype_variant = false;
317 }
318 }
319 }
320
321 if self.parser.consume_ident("true") {
322 return visitor.visit_bool(true);
323 } else if self.parser.consume_ident("false") {
324 return visitor.visit_bool(false);
325 } else if self.parser.check_ident("Some") {
326 return self.deserialize_option(visitor);
327 } else if self.parser.consume_ident("None") {
328 return visitor.visit_none();
329 } else if self.parser.consume_str("()") {
330 return visitor.visit_unit();
331 } else if self.parser.consume_ident("inf") || self.parser.consume_ident("inff32") {
332 return visitor.visit_f32(core::f32::INFINITY);
333 } else if self.parser.consume_ident("inff64") {
334 return visitor.visit_f64(core::f64::INFINITY);
335 } else if self.parser.consume_ident("NaN") || self.parser.consume_ident("NaNf32") {
336 return visitor.visit_f32(core::f32::NAN);
337 } else if self.parser.consume_ident("NaNf64") {
338 return visitor.visit_f64(core::f64::NAN);
339 }
340
341 if let Some(ident) = self.parser.skip_identifier() {
343 self.parser.skip_ws()?;
344
345 return self.handle_any_struct(visitor, Some(ident));
346 }
347
348 match self.parser.peek_char_or_eof()? {
349 '(' => self.handle_any_struct(visitor, None),
350 '[' => self.deserialize_seq(visitor),
351 '{' => self.deserialize_map(visitor),
352 '0'..='9' | '+' | '-' | '.' => self.parser.any_number()?.visit(visitor),
353 '"' | 'r' => self.deserialize_string(visitor),
354 'b' if self.parser.src().starts_with("b'") => self.parser.any_number()?.visit(visitor),
355 'b' => self.deserialize_byte_buf(visitor),
356 '\'' => self.deserialize_char(visitor),
357 other => Err(Error::UnexpectedChar(other)),
358 }
359 }
360
361 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
362 where
363 V: Visitor<'de>,
364 {
365 visitor.visit_bool(self.parser.bool()?)
366 }
367
368 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value>
369 where
370 V: Visitor<'de>,
371 {
372 visitor.visit_i8(self.parser.integer()?)
373 }
374
375 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value>
376 where
377 V: Visitor<'de>,
378 {
379 visitor.visit_i16(self.parser.integer()?)
380 }
381
382 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value>
383 where
384 V: Visitor<'de>,
385 {
386 visitor.visit_i32(self.parser.integer()?)
387 }
388
389 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value>
390 where
391 V: Visitor<'de>,
392 {
393 visitor.visit_i64(self.parser.integer()?)
394 }
395
396 #[cfg(feature = "integer128")]
397 fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value>
398 where
399 V: Visitor<'de>,
400 {
401 visitor.visit_i128(self.parser.integer()?)
402 }
403
404 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value>
405 where
406 V: Visitor<'de>,
407 {
408 visitor.visit_u8(self.parser.integer()?)
409 }
410
411 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value>
412 where
413 V: Visitor<'de>,
414 {
415 visitor.visit_u16(self.parser.integer()?)
416 }
417
418 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value>
419 where
420 V: Visitor<'de>,
421 {
422 visitor.visit_u32(self.parser.integer()?)
423 }
424
425 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value>
426 where
427 V: Visitor<'de>,
428 {
429 visitor.visit_u64(self.parser.integer()?)
430 }
431
432 #[cfg(feature = "integer128")]
433 fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value>
434 where
435 V: Visitor<'de>,
436 {
437 visitor.visit_u128(self.parser.integer()?)
438 }
439
440 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value>
441 where
442 V: Visitor<'de>,
443 {
444 visitor.visit_f32(self.parser.float()?)
445 }
446
447 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value>
448 where
449 V: Visitor<'de>,
450 {
451 visitor.visit_f64(self.parser.float()?)
452 }
453
454 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
455 where
456 V: Visitor<'de>,
457 {
458 visitor.visit_char(self.parser.char()?)
459 }
460
461 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
462 where
463 V: Visitor<'de>,
464 {
465 match self.parser.string()? {
466 ParsedStr::Allocated(s) => visitor.visit_string(s),
467 ParsedStr::Slice(s) => visitor.visit_borrowed_str(s),
468 }
469 }
470
471 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
472 where
473 V: Visitor<'de>,
474 {
475 self.deserialize_str(visitor)
476 }
477
478 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
479 where
480 V: Visitor<'de>,
481 {
482 self.deserialize_byte_buf(visitor)
483 }
484
485 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
486 where
487 V: Visitor<'de>,
488 {
489 if self.parser.check_char('[') {
490 let bytes = Vec::<u8>::deserialize(self)?;
491 return visitor.visit_byte_buf(bytes);
492 }
493
494 match self.parser.byte_string()? {
495 ParsedByteStr::Allocated(byte_buf) => visitor.visit_byte_buf(byte_buf),
496 ParsedByteStr::Slice(bytes) => visitor.visit_borrowed_bytes(bytes),
497 }
498 }
499
500 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
501 where
502 V: Visitor<'de>,
503 {
504 if self.parser.consume_ident("None") {
505 visitor.visit_none()
506 } else if self.parser.consume_ident("Some") && {
507 self.parser.skip_ws()?;
508 self.parser.consume_char('(')
509 } {
510 self.parser.skip_ws()?;
511
512 self.newtype_variant = self
513 .parser
514 .exts
515 .contains(Extensions::UNWRAP_VARIANT_NEWTYPES);
516
517 let v = guard_recursion! { self => visitor.visit_some(&mut *self)? };
518
519 self.newtype_variant = false;
520
521 self.parser.comma()?;
522
523 if self.parser.consume_char(')') {
524 Ok(v)
525 } else {
526 Err(Error::ExpectedOptionEnd)
527 }
528 } else if self.parser.exts.contains(Extensions::IMPLICIT_SOME) {
529 guard_recursion! { self => visitor.visit_some(&mut *self) }
530 } else {
531 Err(Error::ExpectedOption)
532 }
533 }
534
535 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
537 where
538 V: Visitor<'de>,
539 {
540 if self.newtype_variant || self.parser.consume_str("()") {
541 self.newtype_variant = false;
542
543 visitor.visit_unit()
544 } else {
545 Err(Error::ExpectedUnit)
546 }
547 }
548
549 fn deserialize_unit_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
550 where
551 V: Visitor<'de>,
552 {
553 if self.newtype_variant || self.parser.consume_struct_name(name)? {
554 self.newtype_variant = false;
555
556 visitor.visit_unit()
557 } else {
558 self.deserialize_unit(visitor)
559 }
560 }
561
562 fn deserialize_newtype_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
563 where
564 V: Visitor<'de>,
565 {
566 if name == crate::value::raw::RAW_VALUE_TOKEN {
567 let src_before = self.parser.pre_ws_src();
568 self.parser.skip_ws()?;
569 let _ignored = self.deserialize_ignored_any(serde::de::IgnoredAny)?;
570 self.parser.skip_ws()?;
571 let src_after = self.parser.src();
572
573 if self.parser.has_unclosed_line_comment() {
574 return Err(Error::UnclosedLineComment);
575 }
576
577 let ron_str = &src_before[..src_before.len() - src_after.len()];
578
579 return visitor
580 .visit_borrowed_str::<Error>(ron_str)
581 .map_err(|_| Error::ExpectedRawValue);
582 }
583
584 if self.parser.exts.contains(Extensions::UNWRAP_NEWTYPES) || self.newtype_variant {
585 self.newtype_variant = false;
586
587 return guard_recursion! { self => visitor.visit_newtype_struct(&mut *self) };
588 }
589
590 self.parser.consume_struct_name(name)?;
591
592 self.parser.skip_ws()?;
593
594 if self.parser.consume_char('(') {
595 self.parser.skip_ws()?;
596 let value = guard_recursion! { self => visitor.visit_newtype_struct(&mut *self)? };
597 self.parser.comma()?;
598
599 if self.parser.consume_char(')') {
600 Ok(value)
601 } else {
602 Err(Error::ExpectedStructLikeEnd)
603 }
604 } else if name.is_empty() {
605 Err(Error::ExpectedStructLike)
606 } else {
607 Err(Error::ExpectedNamedStructLike(name))
608 }
609 }
610
611 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
612 where
613 V: Visitor<'de>,
614 {
615 self.newtype_variant = false;
616
617 if self.parser.consume_char('[') {
618 let value = guard_recursion! { self =>
619 visitor.visit_seq(CommaSeparated::new(Terminator::Seq, self))?
620 };
621 self.parser.skip_ws()?;
622
623 if self.parser.consume_char(']') {
624 Ok(value)
625 } else {
626 Err(Error::ExpectedArrayEnd)
627 }
628 } else {
629 Err(Error::ExpectedArray)
630 }
631 }
632
633 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
634 where
635 V: Visitor<'de>,
636 {
637 if self.newtype_variant || self.parser.consume_char('(') {
638 let old_newtype_variant = self.newtype_variant;
639 self.newtype_variant = false;
640
641 let value = guard_recursion! { self =>
642 visitor.visit_seq(CommaSeparated::new(Terminator::Tuple, self))?
643 };
644 self.parser.skip_ws()?;
645
646 if old_newtype_variant || self.parser.consume_char(')') {
647 Ok(value)
648 } else {
649 Err(Error::ExpectedStructLikeEnd)
650 }
651 } else {
652 Err(Error::ExpectedStructLike)
653 }
654 }
655
656 fn deserialize_tuple_struct<V>(
657 self,
658 name: &'static str,
659 len: usize,
660 visitor: V,
661 ) -> Result<V::Value>
662 where
663 V: Visitor<'de>,
664 {
665 if !self.newtype_variant {
666 self.parser.consume_struct_name(name)?;
667 }
668
669 self.deserialize_tuple(len, visitor).map_err(|e| match e {
670 Error::ExpectedStructLike if !name.is_empty() => Error::ExpectedNamedStructLike(name),
671 e => e,
672 })
673 }
674
675 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
676 where
677 V: Visitor<'de>,
678 {
679 struct VisitorExpecting<V>(V);
680 impl<'de, V: Visitor<'de>> core::fmt::Display for VisitorExpecting<&'_ V> {
681 fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result {
682 self.0.expecting(fmt)
683 }
684 }
685
686 self.newtype_variant = false;
687
688 let serde_flatten_canary = VisitorExpecting(&visitor)
690 .to_string()
691 .starts_with("struct ");
692
693 let terminator = if serde_flatten_canary {
694 Terminator::MapAsStruct
695 } else {
696 Terminator::Map
697 };
698
699 if self.parser.consume_char('{') {
700 let value = guard_recursion! { self =>
701 visitor.visit_map(CommaSeparated::new(terminator, self))?
702 };
703 self.parser.skip_ws()?;
704
705 if self.parser.consume_char('}') {
706 Ok(value)
707 } else {
708 Err(Error::ExpectedMapEnd)
709 }
710 } else {
711 Err(Error::ExpectedMap)
712 }
713 }
714
715 fn deserialize_struct<V>(
716 self,
717 name: &'static str,
718 _fields: &'static [&'static str],
719 visitor: V,
720 ) -> Result<V::Value>
721 where
722 V: Visitor<'de>,
723 {
724 if !self.newtype_variant {
725 self.parser.consume_struct_name(name)?;
726 }
727
728 self.parser.skip_ws()?;
729
730 self.handle_struct_after_name(name, visitor)
731 }
732
733 fn deserialize_enum<V>(
734 self,
735 name: &'static str,
736 _variants: &'static [&'static str],
737 visitor: V,
738 ) -> Result<V::Value>
739 where
740 V: Visitor<'de>,
741 {
742 self.newtype_variant = false;
743
744 match guard_recursion! { self => visitor.visit_enum(Enum::new(self)) } {
745 Ok(value) => Ok(value),
746 Err(Error::NoSuchEnumVariant {
747 expected,
748 found,
749 outer: None,
750 }) if !name.is_empty() => Err(Error::NoSuchEnumVariant {
751 expected,
752 found,
753 outer: Some(String::from(name)),
754 }),
755 Err(e) => Err(e),
756 }
757 }
758
759 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
760 where
761 V: Visitor<'de>,
762 {
763 let identifier = self.parser.identifier()?;
764
765 self.last_identifier = Some(identifier);
766
767 visitor.visit_borrowed_str(identifier)
768 }
769
770 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
771 where
772 V: Visitor<'de>,
773 {
774 self.deserialize_any(visitor)
775 }
776}
777
778enum Terminator {
779 Map,
780 MapAsStruct,
781 Tuple,
782 Struct,
783 Seq,
784}
785
786impl Terminator {
787 fn as_char(&self) -> char {
788 match self {
789 Terminator::Map | Terminator::MapAsStruct => '}',
790 Terminator::Tuple | Terminator::Struct => ')',
791 Terminator::Seq => ']',
792 }
793 }
794}
795
796struct CommaSeparated<'a, 'de: 'a> {
797 de: &'a mut Deserializer<'de>,
798 terminator: Terminator,
799 had_comma: bool,
800 inside_internally_tagged_enum: bool,
801}
802
803impl<'a, 'de> CommaSeparated<'a, 'de> {
804 fn new(terminator: Terminator, de: &'a mut Deserializer<'de>) -> Self {
805 CommaSeparated {
806 de,
807 terminator,
808 had_comma: true,
809 inside_internally_tagged_enum: false,
810 }
811 }
812
813 fn has_element(&mut self) -> Result<bool> {
814 self.de.parser.skip_ws()?;
815
816 match (
817 self.had_comma,
818 !self.de.parser.check_char(self.terminator.as_char()),
819 ) {
820 (true, has_element) => Ok(has_element),
822 (false, false) => Ok(false),
824 (false, true) => Err(Error::ExpectedComma),
826 }
827 }
828}
829
830impl<'de, 'a> de::SeqAccess<'de> for CommaSeparated<'a, 'de> {
831 type Error = Error;
832
833 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
834 where
835 T: DeserializeSeed<'de>,
836 {
837 if self.has_element()? {
838 let res = guard_recursion! { self.de => seed.deserialize(&mut *self.de)? };
839
840 self.had_comma = self.de.parser.comma()?;
841
842 Ok(Some(res))
843 } else {
844 Ok(None)
845 }
846 }
847}
848
849impl<'de, 'a> de::MapAccess<'de> for CommaSeparated<'a, 'de> {
850 type Error = Error;
851
852 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
853 where
854 K: DeserializeSeed<'de>,
855 {
856 if self.has_element()? {
857 self.inside_internally_tagged_enum = is_serde_tag_or_content::<K::Value>();
858
859 match self.terminator {
860 Terminator::Struct => guard_recursion! { self.de =>
861 seed.deserialize(&mut id::Deserializer::new(&mut *self.de, false)).map(Some)
862 },
863 Terminator::MapAsStruct => guard_recursion! { self.de =>
864 seed.deserialize(&mut id::Deserializer::new(&mut *self.de, true)).map(Some)
865 },
866 _ => guard_recursion! { self.de => seed.deserialize(&mut *self.de).map(Some) },
867 }
868 } else {
869 Ok(None)
870 }
871 }
872
873 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
874 where
875 V: DeserializeSeed<'de>,
876 {
877 self.de.parser.skip_ws()?;
878
879 if self.de.parser.consume_char(':') {
880 self.de.parser.skip_ws()?;
881
882 let res = if self.inside_internally_tagged_enum && !is_serde_content::<V::Value>() {
883 guard_recursion! { self.de =>
884 seed.deserialize(&mut tag::Deserializer::new(&mut *self.de))?
885 }
886 } else {
887 guard_recursion! { self.de =>
888 seed.deserialize(&mut *self.de)?
889 }
890 };
891
892 self.had_comma = self.de.parser.comma()?;
893
894 Ok(res)
895 } else {
896 Err(Error::ExpectedMapColon)
897 }
898 }
899}
900
901struct Enum<'a, 'de: 'a> {
902 de: &'a mut Deserializer<'de>,
903}
904
905impl<'a, 'de> Enum<'a, 'de> {
906 fn new(de: &'a mut Deserializer<'de>) -> Self {
907 Enum { de }
908 }
909}
910
911impl<'de, 'a> de::EnumAccess<'de> for Enum<'a, 'de> {
912 type Error = Error;
913 type Variant = Self;
914
915 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)>
916 where
917 V: DeserializeSeed<'de>,
918 {
919 self.de.parser.skip_ws()?;
920
921 let value = guard_recursion! { self.de => seed.deserialize(&mut *self.de)? };
922
923 Ok((value, self))
924 }
925}
926
927impl<'de, 'a> de::VariantAccess<'de> for Enum<'a, 'de> {
928 type Error = Error;
929
930 fn unit_variant(self) -> Result<()> {
931 Ok(())
932 }
933
934 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
935 where
936 T: DeserializeSeed<'de>,
937 {
938 let newtype_variant = self.de.last_identifier;
939
940 self.de.parser.skip_ws()?;
941
942 if self.de.parser.consume_char('(') {
943 self.de.parser.skip_ws()?;
944
945 self.de.newtype_variant = self
946 .de
947 .parser
948 .exts
949 .contains(Extensions::UNWRAP_VARIANT_NEWTYPES);
950
951 let val = guard_recursion! { self.de =>
952 seed
953 .deserialize(&mut *self.de)
954 .map_err(|err| struct_error_name(err, newtype_variant))?
955 };
956
957 self.de.newtype_variant = false;
958
959 self.de.parser.comma()?;
960
961 if self.de.parser.consume_char(')') {
962 Ok(val)
963 } else {
964 Err(Error::ExpectedStructLikeEnd)
965 }
966 } else {
967 Err(Error::ExpectedStructLike)
968 }
969 }
970
971 fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value>
972 where
973 V: Visitor<'de>,
974 {
975 self.de.parser.skip_ws()?;
976
977 self.de.deserialize_tuple(len, visitor)
978 }
979
980 fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value>
981 where
982 V: Visitor<'de>,
983 {
984 let struct_variant = self.de.last_identifier;
985
986 self.de.parser.skip_ws()?;
987
988 self.de
989 .handle_struct_after_name("", visitor)
990 .map_err(|err| struct_error_name(err, struct_variant))
991 }
992}
993
994fn struct_error_name(error: Error, name: Option<&str>) -> Error {
995 match error {
996 Error::NoSuchStructField {
997 expected,
998 found,
999 outer: None,
1000 } => Error::NoSuchStructField {
1001 expected,
1002 found,
1003 outer: name.map(ToOwned::to_owned),
1004 },
1005 Error::MissingStructField { field, outer: None } => Error::MissingStructField {
1006 field,
1007 outer: name.map(ToOwned::to_owned),
1008 },
1009 Error::DuplicateStructField { field, outer: None } => Error::DuplicateStructField {
1010 field,
1011 outer: name.map(ToOwned::to_owned),
1012 },
1013 e => e,
1014 }
1015}
1016
1017struct SerdeEnumContent<'a, 'de: 'a> {
1018 de: &'a mut Deserializer<'de>,
1019 ident: Option<&'a str>,
1020}
1021
1022impl<'de, 'a> de::MapAccess<'de> for SerdeEnumContent<'a, 'de> {
1023 type Error = Error;
1024
1025 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
1026 where
1027 K: DeserializeSeed<'de>,
1028 {
1029 self.ident
1030 .take()
1031 .map(|ident| seed.deserialize(serde::de::value::StrDeserializer::new(ident)))
1032 .transpose()
1033 }
1034
1035 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
1036 where
1037 V: DeserializeSeed<'de>,
1038 {
1039 self.de.parser.skip_ws()?;
1040
1041 let old_serde_content_newtype = self.de.serde_content_newtype;
1042 self.de.serde_content_newtype = true;
1043 let result = seed.deserialize(&mut *self.de);
1044 self.de.serde_content_newtype = old_serde_content_newtype;
1045
1046 result
1047 }
1048}
1049
1050fn is_serde_content<T>() -> bool {
1052 matches!(
1053 core::any::type_name::<T>(),
1054 "serde::__private::de::content::Content" | "serde::__private::de::content::Content<'_>"
1055 )
1056}
1057
1058fn is_serde_tag_or_content<T>() -> bool {
1059 matches!(
1060 core::any::type_name::<T>(),
1061 "serde::__private::de::content::TagOrContent"
1062 | "serde::__private::de::content::TagOrContent<'_>"
1063 )
1064}