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