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