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 value::NumberDeserializer,
21};
22
23#[cfg(feature = "std")]
24use std::io;
25
26mod id;
27mod tag;
28#[cfg(test)]
29mod tests;
30mod value;
31
32pub 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
44impl<'de> Deserializer<'de> {
45 #[allow(clippy::should_implement_trait)]
47 pub fn from_str(input: &'de str) -> SpannedResult<Self> {
48 Self::from_str_with_options(input, &Options::default())
49 }
50
51 pub fn from_bytes(input: &'de [u8]) -> SpannedResult<Self> {
52 Self::from_bytes_with_options(input, &Options::default())
53 }
54
55 pub fn from_str_with_options(input: &'de str, options: &Options) -> SpannedResult<Self> {
56 let mut deserializer = Deserializer {
57 parser: Parser::new(input)?,
58 newtype_variant: false,
59 serde_content_newtype: false,
60 last_identifier: None,
61 recursion_limit: options.recursion_limit,
62 };
63
64 deserializer.parser.exts |= options.default_extensions;
65
66 Ok(deserializer)
67 }
68
69 #[allow(clippy::missing_panics_doc)]
71 pub fn from_bytes_with_options(input: &'de [u8], options: &Options) -> SpannedResult<Self> {
72 let err = match str::from_utf8(input) {
73 Ok(input) => return Self::from_str_with_options(input, options),
74 Err(err) => err,
75 };
76
77 #[allow(clippy::expect_used)]
79 let valid_input =
80 str::from_utf8(&input[..err.valid_up_to()]).expect("source is valid up to error");
81
82 Err(SpannedError {
83 code: err.into(),
84 span: Span {
85 start: Position { line: 1, col: 1 },
86 end: Position::from_src_end(valid_input),
87 },
88 })
89 }
90
91 #[must_use]
92 pub fn remainder(&self) -> &'de str {
93 self.parser.src()
94 }
95
96 #[must_use]
97 pub fn span_error(&self, code: Error) -> SpannedError {
98 self.parser.span_error(code)
99 }
100
101 #[must_use]
102 pub fn extensions(&self) -> Extensions {
103 self.parser.exts
104 }
105}
106
107#[cfg(feature = "std")]
110pub fn from_reader<R, T>(rdr: R) -> SpannedResult<T>
111where
112 R: io::Read,
113 T: de::DeserializeOwned,
114{
115 Options::default().from_reader(rdr)
116}
117
118pub fn from_str<'a, T>(s: &'a str) -> SpannedResult<T>
121where
122 T: de::Deserialize<'a>,
123{
124 Options::default().from_str(s)
125}
126
127pub fn from_bytes<'a, T>(s: &'a [u8]) -> SpannedResult<T>
130where
131 T: de::Deserialize<'a>,
132{
133 Options::default().from_bytes(s)
134}
135
136macro_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
156impl<'de> Deserializer<'de> {
157 pub fn end(&mut self) -> Result<()> {
160 self.parser.skip_ws()?;
161
162 if self.parser.src().is_empty() {
163 Ok(())
164 } else {
165 Err(Error::TrailingCharacters)
166 }
167 }
168
169 fn handle_any_struct<V>(&mut self, visitor: V, ident: Option<&str>) -> Result<V::Value>
175 where
176 V: Visitor<'de>,
177 {
178 let is_serde_content =
181 is_serde_content::<V::Value>() || is_serde_tag_or_content::<V::Value>();
182
183 let old_serde_content_newtype = self.serde_content_newtype;
184 self.serde_content_newtype = false;
185
186 match (
187 self.parser.check_struct_type(
188 NewtypeMode::NoParensMeanUnit,
189 if old_serde_content_newtype {
190 TupleMode::DifferentiateNewtype } else {
192 TupleMode::ImpreciseTupleOrNewtype },
194 )?,
195 ident,
196 ) {
197 (StructType::Unit, Some(ident)) if is_serde_content => {
198 visitor.visit_str(ident)
200 }
201 (StructType::Unit, _) => visitor.visit_unit(),
202 (_, Some(ident)) if is_serde_content => {
203 visitor.visit_map(SerdeEnumContent {
205 de: self,
206 ident: Some(ident),
207 })
208 }
209 (StructType::Named, _) => {
210 self.handle_struct_after_name("", visitor)
212 }
213 (StructType::NewtypeTuple, _) if old_serde_content_newtype => {
214 self.parser.consume_char('(');
216 self.parser.skip_ws()?;
217 let result = self.deserialize_any(visitor);
218 self.parser.skip_ws()?;
219 self.parser.consume_char(')');
220
221 result
222 }
223 (
224 StructType::AnyTuple
225 | StructType::EmptyTuple
226 | StructType::NewtypeTuple
227 | StructType::NonNewtypeTuple,
228 _,
229 ) => {
230 self.deserialize_tuple(0, visitor)
232 }
233 }
234 }
235
236 fn handle_float_range_or_value<V>(
237 &mut self,
238 number: crate::value::Number,
239 visitor: V,
240 ) -> Result<V::Value>
241 where
242 V: Visitor<'de>,
243 {
244 if self.parser.consume_str("..=") {
245 let end = self.parser.any_number()?;
246 return visitor.visit_map(RangeMapAccess::new(number, end, "end"));
247 } else if self.parser.consume_str("..") {
248 if self
249 .parser
250 .peek_char()
251 .map_or(true, |c| !self.parser.is_number_start(c))
252 {
253 return visitor.visit_map(RangeFromMapAccess::new(number));
254 }
255 let end = self.parser.any_number()?;
256 return visitor.visit_map(RangeMapAccess::new(number, end, "end"));
257 }
258 number.visit(visitor)
259 }
260
261 fn handle_struct_after_name<V>(
269 &mut self,
270 name_for_pretty_errors_only: &'static str,
271 visitor: V,
272 ) -> Result<V::Value>
273 where
274 V: Visitor<'de>,
275 {
276 if self.newtype_variant || self.parser.consume_char('(') {
277 let old_newtype_variant = self.newtype_variant;
278 self.newtype_variant = false;
279
280 let value = guard_recursion! { self =>
281 visitor
282 .visit_map(CommaSeparated::new(Terminator::Struct, self))
283 .map_err(|err| {
284 struct_error_name(
285 err,
286 if !old_newtype_variant && !name_for_pretty_errors_only.is_empty() {
287 Some(name_for_pretty_errors_only)
288 } else {
289 None
290 },
291 )
292 })?
293 };
294
295 self.parser.skip_ws()?;
296
297 if old_newtype_variant || self.parser.consume_char(')') {
298 Ok(value)
299 } else {
300 Err(Error::ExpectedStructLikeEnd)
301 }
302 } else if name_for_pretty_errors_only.is_empty() {
303 Err(Error::ExpectedStructLike)
304 } else {
305 Err(Error::ExpectedNamedStructLike(name_for_pretty_errors_only))
306 }
307 }
308}
309
310impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
311 type Error = Error;
312
313 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
314 where
315 V: Visitor<'de>,
316 {
317 if self.newtype_variant {
318 if self.parser.check_char(')') {
319 return self.deserialize_unit(visitor);
321 }
322
323 #[allow(clippy::wildcard_in_or_patterns)]
324 match self
325 .parser
326 .check_struct_type(NewtypeMode::InsideNewtype, TupleMode::DifferentiateNewtype)?
327 {
328 StructType::Named => {
329 return self.handle_struct_after_name("", visitor);
332 }
333 StructType::EmptyTuple | StructType::NonNewtypeTuple => {
334 return self.deserialize_tuple(0, visitor);
337 }
338 StructType::NewtypeTuple | _ => {
341 self.newtype_variant = false;
343 }
344 }
345 }
346
347 if self.parser.consume_ident("true") {
348 return visitor.visit_bool(true);
349 } else if self.parser.consume_ident("false") {
350 return visitor.visit_bool(false);
351 } else if self.parser.check_ident("Some") {
352 return self.deserialize_option(visitor);
353 } else if self.parser.consume_ident("None") {
354 return visitor.visit_none();
355 } else if self.parser.consume_str("()") {
356 return visitor.visit_unit();
357 } else if self.parser.consume_ident("inf") || self.parser.consume_ident("inff32") {
358 let number = crate::value::Number::F32(crate::value::F32(core::f32::INFINITY));
359 return self.handle_float_range_or_value(number, visitor);
360 } else if self.parser.consume_ident("inff64") {
361 let number = crate::value::Number::F64(crate::value::F64(core::f64::INFINITY));
362 return self.handle_float_range_or_value(number, visitor);
363 } else if self.parser.consume_ident("NaN") || self.parser.consume_ident("NaNf32") {
364 let number = crate::value::Number::F32(crate::value::F32(core::f32::NAN));
365 return self.handle_float_range_or_value(number, visitor);
366 } else if self.parser.consume_ident("NaNf64") {
367 let number = crate::value::Number::F64(crate::value::F64(core::f64::NAN));
368 return self.handle_float_range_or_value(number, visitor);
369 }
370
371 if let Some(ident) = self.parser.skip_identifier() {
373 self.parser.skip_ws()?;
374
375 return self.handle_any_struct(visitor, Some(ident));
376 }
377
378 match self.parser.peek_char_or_eof()? {
379 '(' => self.handle_any_struct(visitor, None),
380 '[' => self.deserialize_seq(visitor),
381 '{' => self.deserialize_map(visitor),
382 '0'..='9' | '+' | '-' | '.' | 'b' => {
383 if self.parser.check_char('b') && !self.parser.src().starts_with("b'") {
384 return self.deserialize_byte_buf(visitor);
385 }
386
387 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 }
392
393 if self.parser.check_str("..") {
394 let after_dots = &self.parser.src()[2..];
395 if after_dots.starts_with(|c: char| self.parser.is_number_start(c)) {
396 self.parser.consume_str("..");
397 let end = self.parser.any_number()?;
398 return visitor.visit_map(RangeToMapAccess::new(end, "end"));
399 }
400 self.parser.consume_str("..");
401 return visitor.visit_unit();
402 }
403
404 let start = self.parser.any_number()?;
405
406 self.handle_float_range_or_value(start, visitor)
407 }
408 '"' | 'r' => self.deserialize_string(visitor),
409 '\'' => self.deserialize_char(visitor),
410 other => Err(Error::UnexpectedChar(other)),
411 }
412 }
413
414 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
415 where
416 V: Visitor<'de>,
417 {
418 visitor.visit_bool(self.parser.bool()?)
419 }
420
421 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value>
422 where
423 V: Visitor<'de>,
424 {
425 visitor.visit_i8(self.parser.integer()?)
426 }
427
428 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value>
429 where
430 V: Visitor<'de>,
431 {
432 visitor.visit_i16(self.parser.integer()?)
433 }
434
435 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value>
436 where
437 V: Visitor<'de>,
438 {
439 visitor.visit_i32(self.parser.integer()?)
440 }
441
442 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value>
443 where
444 V: Visitor<'de>,
445 {
446 visitor.visit_i64(self.parser.integer()?)
447 }
448
449 #[cfg(feature = "integer128")]
450 fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value>
451 where
452 V: Visitor<'de>,
453 {
454 visitor.visit_i128(self.parser.integer()?)
455 }
456
457 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value>
458 where
459 V: Visitor<'de>,
460 {
461 visitor.visit_u8(self.parser.integer()?)
462 }
463
464 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value>
465 where
466 V: Visitor<'de>,
467 {
468 visitor.visit_u16(self.parser.integer()?)
469 }
470
471 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value>
472 where
473 V: Visitor<'de>,
474 {
475 visitor.visit_u32(self.parser.integer()?)
476 }
477
478 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value>
479 where
480 V: Visitor<'de>,
481 {
482 visitor.visit_u64(self.parser.integer()?)
483 }
484
485 #[cfg(feature = "integer128")]
486 fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value>
487 where
488 V: Visitor<'de>,
489 {
490 visitor.visit_u128(self.parser.integer()?)
491 }
492
493 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value>
494 where
495 V: Visitor<'de>,
496 {
497 visitor.visit_f32(self.parser.float()?)
498 }
499
500 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value>
501 where
502 V: Visitor<'de>,
503 {
504 visitor.visit_f64(self.parser.float()?)
505 }
506
507 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
508 where
509 V: Visitor<'de>,
510 {
511 visitor.visit_char(self.parser.char()?)
512 }
513
514 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
515 where
516 V: Visitor<'de>,
517 {
518 match self.parser.string()? {
519 ParsedStr::Allocated(s) => visitor.visit_string(s),
520 ParsedStr::Slice(s) => visitor.visit_borrowed_str(s),
521 }
522 }
523
524 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
525 where
526 V: Visitor<'de>,
527 {
528 self.deserialize_str(visitor)
529 }
530
531 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
532 where
533 V: Visitor<'de>,
534 {
535 self.deserialize_byte_buf(visitor)
536 }
537
538 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
539 where
540 V: Visitor<'de>,
541 {
542 if self.parser.check_char('[') {
543 let bytes = Vec::<u8>::deserialize(self)?;
544 return visitor.visit_byte_buf(bytes);
545 }
546
547 match self.parser.byte_string()? {
548 ParsedByteStr::Allocated(byte_buf) => visitor.visit_byte_buf(byte_buf),
549 ParsedByteStr::Slice(bytes) => visitor.visit_borrowed_bytes(bytes),
550 }
551 }
552
553 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
554 where
555 V: Visitor<'de>,
556 {
557 if self.parser.consume_ident("None") {
558 visitor.visit_none()
559 } else if self.parser.consume_ident("Some") && {
560 self.parser.skip_ws()?;
561 self.parser.consume_char('(')
562 } {
563 self.parser.skip_ws()?;
564
565 self.newtype_variant = self
566 .parser
567 .exts
568 .contains(Extensions::UNWRAP_VARIANT_NEWTYPES);
569
570 let v = guard_recursion! { self => visitor.visit_some(&mut *self)? };
571
572 self.newtype_variant = false;
573
574 self.parser.comma()?;
575
576 if self.parser.consume_char(')') {
577 Ok(v)
578 } else {
579 Err(Error::ExpectedOptionEnd)
580 }
581 } else if self.parser.exts.contains(Extensions::IMPLICIT_SOME) {
582 guard_recursion! { self => visitor.visit_some(&mut *self) }
583 } else {
584 Err(Error::ExpectedOption)
585 }
586 }
587
588 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
590 where
591 V: Visitor<'de>,
592 {
593 if self.newtype_variant || self.parser.consume_str("()") {
594 self.newtype_variant = false;
595
596 visitor.visit_unit()
597 } else {
598 Err(Error::ExpectedUnit)
599 }
600 }
601
602 fn deserialize_unit_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
603 where
604 V: Visitor<'de>,
605 {
606 if name == "RangeFull" && self.parser.consume_str("..") {
607 return visitor.visit_unit();
608 }
609
610 if self.newtype_variant || self.parser.consume_struct_name(name)? {
611 self.newtype_variant = false;
612
613 visitor.visit_unit()
614 } else {
615 self.deserialize_unit(visitor)
616 }
617 }
618
619 fn deserialize_newtype_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
620 where
621 V: Visitor<'de>,
622 {
623 if name == crate::value::raw::RAW_VALUE_TOKEN {
624 let src_before = self.parser.pre_ws_src();
625 self.parser.skip_ws()?;
626 let _ignored = self.deserialize_ignored_any(de::IgnoredAny)?;
627 self.parser.skip_ws()?;
628 let src_after = self.parser.src();
629
630 if self.parser.has_unclosed_line_comment() {
631 return Err(Error::UnclosedLineComment);
632 }
633
634 let ron_str = &src_before[..src_before.len() - src_after.len()];
635
636 return visitor
637 .visit_borrowed_str::<Error>(ron_str)
638 .map_err(|_| Error::ExpectedRawValue);
639 }
640
641 if self.parser.exts.contains(Extensions::UNWRAP_NEWTYPES) || self.newtype_variant {
642 self.newtype_variant = false;
643
644 return guard_recursion! { self => visitor.visit_newtype_struct(&mut *self) };
645 }
646
647 self.parser.consume_struct_name(name)?;
648
649 self.parser.skip_ws()?;
650
651 if self.parser.consume_char('(') {
652 self.parser.skip_ws()?;
653 let value = guard_recursion! { self => visitor.visit_newtype_struct(&mut *self)? };
654 self.parser.comma()?;
655
656 if self.parser.consume_char(')') {
657 Ok(value)
658 } else {
659 Err(Error::ExpectedStructLikeEnd)
660 }
661 } else if name.is_empty() {
662 Err(Error::ExpectedStructLike)
663 } else {
664 Err(Error::ExpectedNamedStructLike(name))
665 }
666 }
667
668 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
669 where
670 V: Visitor<'de>,
671 {
672 self.newtype_variant = false;
673
674 if self.parser.consume_char('[') {
675 let value = guard_recursion! { self =>
676 visitor.visit_seq(CommaSeparated::new(Terminator::Seq, self))?
677 };
678 self.parser.skip_ws()?;
679
680 if self.parser.consume_char(']') {
681 Ok(value)
682 } else {
683 Err(Error::ExpectedArrayEnd)
684 }
685 } else {
686 Err(Error::ExpectedArray)
687 }
688 }
689
690 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
691 where
692 V: Visitor<'de>,
693 {
694 if self.newtype_variant || self.parser.consume_char('(') {
695 let old_newtype_variant = self.newtype_variant;
696 self.newtype_variant = false;
697
698 let value = guard_recursion! { self =>
699 visitor.visit_seq(CommaSeparated::new(Terminator::Tuple, self))?
700 };
701 self.parser.skip_ws()?;
702
703 if old_newtype_variant || self.parser.consume_char(')') {
704 Ok(value)
705 } else {
706 Err(Error::ExpectedStructLikeEnd)
707 }
708 } else {
709 Err(Error::ExpectedStructLike)
710 }
711 }
712
713 fn deserialize_tuple_struct<V>(
714 self,
715 name: &'static str,
716 len: usize,
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.deserialize_tuple(len, visitor).map_err(|e| match e {
727 Error::ExpectedStructLike if !name.is_empty() => Error::ExpectedNamedStructLike(name),
728 e => e,
729 })
730 }
731
732 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
733 where
734 V: Visitor<'de>,
735 {
736 struct VisitorExpecting<V>(V);
737 impl<'de, V: Visitor<'de>> core::fmt::Display for VisitorExpecting<&'_ V> {
738 fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result {
739 self.0.expecting(fmt)
740 }
741 }
742
743 self.newtype_variant = false;
744
745 let serde_flatten_canary = VisitorExpecting(&visitor)
747 .to_string()
748 .starts_with("struct ");
749
750 let terminator = if serde_flatten_canary {
751 Terminator::MapAsStruct
752 } else {
753 Terminator::Map
754 };
755
756 if self.parser.consume_char('{') {
757 let value = guard_recursion! { self =>
758 visitor.visit_map(CommaSeparated::new(terminator, self))?
759 };
760 self.parser.skip_ws()?;
761
762 if self.parser.consume_char('}') {
763 Ok(value)
764 } else {
765 Err(Error::ExpectedMapEnd)
766 }
767 } else {
768 Err(Error::ExpectedMap)
769 }
770 }
771
772 fn deserialize_struct<V>(
773 self,
774 name: &'static str,
775 fields: &'static [&'static str],
776 visitor: V,
777 ) -> Result<V::Value>
778 where
779 V: Visitor<'de>,
780 {
781 if (name == "Range" && fields == ["start", "end"])
783 || (name == "RangeInclusive" && matches!(fields, ["start", "end" | "last"]))
784 {
785 let end_field = fields[1];
786 if let Some(c) = self.parser.peek_char() {
787 if self.parser.is_number_start(c) {
788 let start = self.parser.any_number()?;
789
790 let inclusive = if self.parser.consume_str("..=") {
791 true
792 } else if self.parser.consume_str("..") {
793 false
794 } else {
795 return Err(Error::ExpectedRangeSyntax);
796 };
797
798 if inclusive && name == "Range" {
799 return Err(Error::Message(String::from(
800 "expected `..` for `Range`, found `..=`",
801 )));
802 }
803 if !inclusive && name == "RangeInclusive" {
804 return Err(Error::Message(String::from(
805 "expected `..=` for `RangeInclusive`, found `..`",
806 )));
807 }
808
809 let end = self.parser.any_number()?;
810 return visitor.visit_map(RangeMapAccess::new(start, end, end_field));
811 }
812 }
813 }
814
815 if fields == ["start"] && name == "RangeFrom" {
816 if let Some(c) = self.parser.peek_char() {
817 if self.parser.is_number_start(c)
818 || self.parser.check_ident("inf")
819 || self.parser.check_ident("inff32")
820 || self.parser.check_ident("inff64")
821 || self.parser.check_ident("NaN")
822 || self.parser.check_ident("NaNf32")
823 || self.parser.check_ident("NaNf64")
824 {
825 let start = self.parser.any_number()?;
826 if self.parser.consume_str("..=") {
827 return Err(Error::Message(String::from(
828 "expected `..` for `RangeFrom`, found `..=`",
829 )));
830 } else if !self.parser.consume_str("..") {
831 return Err(Error::ExpectedRangeSyntax);
832 }
833 return visitor.visit_map(RangeFromMapAccess::new(start));
834 }
835 }
836 }
837
838 if fields == ["end"]
839 && name == "RangeTo"
840 && (self.parser.check_str("..=") || self.parser.check_str(".."))
841 {
842 if self.parser.consume_str("..=") {
843 return Err(Error::Message(String::from(
844 "expected `..` for `RangeTo`, found `..=`",
845 )));
846 }
847 self.parser.consume_str("..");
848 let end = self.parser.any_number()?;
849 return visitor.visit_map(RangeToMapAccess::new(end, "end"));
850 }
851
852 if matches!(fields, ["end" | "last"])
854 && name == "RangeToInclusive"
855 && (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 }
866
867 if !self.newtype_variant {
868 self.parser.consume_struct_name(name)?;
869 }
870
871 self.parser.skip_ws()?;
872
873 self.handle_struct_after_name(name, visitor)
874 }
875
876 fn deserialize_enum<V>(
877 self,
878 name: &'static str,
879 _variants: &'static [&'static str],
880 visitor: V,
881 ) -> Result<V::Value>
882 where
883 V: Visitor<'de>,
884 {
885 self.newtype_variant = false;
886
887 match guard_recursion! { self => visitor.visit_enum(Enum::new(self)) } {
888 Ok(value) => Ok(value),
889 Err(Error::NoSuchEnumVariant {
890 expected,
891 found,
892 outer: None,
893 }) if !name.is_empty() => Err(Error::NoSuchEnumVariant {
894 expected,
895 found,
896 outer: Some(String::from(name)),
897 }),
898 Err(e) => Err(e),
899 }
900 }
901
902 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
903 where
904 V: Visitor<'de>,
905 {
906 let identifier = self.parser.identifier()?;
907
908 self.last_identifier = Some(identifier);
909
910 visitor.visit_borrowed_str(identifier)
911 }
912
913 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
914 where
915 V: Visitor<'de>,
916 {
917 self.deserialize_any(visitor)
918 }
919}
920
921enum Terminator {
922 Map,
923 MapAsStruct,
924 Tuple,
925 Struct,
926 Seq,
927}
928
929impl Terminator {
930 fn as_char(&self) -> char {
931 match self {
932 Terminator::Map | Terminator::MapAsStruct => '}',
933 Terminator::Tuple | Terminator::Struct => ')',
934 Terminator::Seq => ']',
935 }
936 }
937}
938
939struct 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
946impl<'a, 'de> CommaSeparated<'a, 'de> {
947 fn new(terminator: Terminator, de: &'a mut Deserializer<'de>) -> Self {
948 CommaSeparated {
949 de,
950 terminator,
951 had_comma: true,
952 inside_internally_tagged_enum: false,
953 }
954 }
955
956 fn has_element(&mut self) -> Result<bool> {
957 self.de.parser.skip_ws()?;
958
959 match (
960 self.had_comma,
961 !self.de.parser.check_char(self.terminator.as_char()),
962 ) {
963 (true, has_element) => Ok(has_element),
965 (false, false) => Ok(false),
967 (false, true) => Err(Error::ExpectedComma),
969 }
970 }
971}
972
973enum RangeMapState {
974 StartKey,
975 StartValue,
976 EndKey,
977 EndValue,
978 Done,
979}
980
981struct RangeMapAccess {
982 start: crate::value::Number,
983 end: crate::value::Number,
984 state: RangeMapState,
985 end_key: &'static str,
986}
987
988impl RangeMapAccess {
989 fn new(start: crate::value::Number, end: crate::value::Number, end_key: &'static str) -> Self {
990 RangeMapAccess {
991 start,
992 end,
993 state: RangeMapState::StartKey,
994 end_key,
995 }
996 }
997}
998
999impl<'de> de::MapAccess<'de> for RangeMapAccess {
1000 type Error = Error;
1001
1002 fn next_key_seed<K: de::DeserializeSeed<'de>>(&mut self, seed: K) -> Result<Option<K::Value>> {
1003 match self.state {
1004 RangeMapState::StartKey => {
1005 self.state = RangeMapState::StartValue;
1006 seed.deserialize(de::value::StrDeserializer::<Error>::new("start"))
1007 .map(Some)
1008 }
1009 RangeMapState::EndKey => {
1010 self.state = RangeMapState::EndValue;
1011 seed.deserialize(de::value::StrDeserializer::<Error>::new(self.end_key))
1012 .map(Some)
1013 }
1014 _ => Ok(None),
1015 }
1016 }
1017
1018 fn next_value_seed<V: de::DeserializeSeed<'de>>(&mut self, seed: V) -> Result<V::Value> {
1019 match self.state {
1020 RangeMapState::StartValue => {
1021 self.state = RangeMapState::EndKey;
1022 seed.deserialize(NumberDeserializer(self.start))
1023 }
1024 RangeMapState::EndValue => {
1025 self.state = RangeMapState::Done;
1026 seed.deserialize(NumberDeserializer(self.end))
1027 }
1028 _ => Err(Error::ExpectedDifferentLength {
1029 expected: String::from("map of length 2"),
1030 found: 3,
1031 }),
1032 }
1033 }
1034}
1035
1036struct RangeFromMapAccess {
1037 start: crate::value::Number,
1038 done: bool,
1039}
1040
1041impl RangeFromMapAccess {
1042 fn new(start: crate::value::Number) -> Self {
1043 RangeFromMapAccess { start, done: false }
1044 }
1045}
1046
1047impl<'de> de::MapAccess<'de> for RangeFromMapAccess {
1048 type Error = Error;
1049
1050 fn next_key_seed<K: de::DeserializeSeed<'de>>(&mut self, seed: K) -> Result<Option<K::Value>> {
1051 if self.done {
1052 return Ok(None);
1053 }
1054 seed.deserialize(de::value::StrDeserializer::<Error>::new("start"))
1055 .map(Some)
1056 }
1057
1058 fn next_value_seed<V: de::DeserializeSeed<'de>>(&mut self, seed: V) -> Result<V::Value> {
1059 if self.done {
1060 return Err(Error::ExpectedDifferentLength {
1061 expected: String::from("map of length 1"),
1062 found: 2,
1063 });
1064 }
1065 self.done = true;
1066 seed.deserialize(NumberDeserializer(self.start))
1067 }
1068}
1069
1070struct RangeToMapAccess {
1071 end: crate::value::Number,
1072 end_key: &'static str,
1073 done: bool,
1074}
1075
1076impl RangeToMapAccess {
1077 fn new(end: crate::value::Number, end_key: &'static str) -> Self {
1078 RangeToMapAccess {
1079 end,
1080 end_key,
1081 done: false,
1082 }
1083 }
1084}
1085
1086impl<'de> de::MapAccess<'de> for RangeToMapAccess {
1087 type Error = Error;
1088
1089 fn next_key_seed<K: de::DeserializeSeed<'de>>(&mut self, seed: K) -> Result<Option<K::Value>> {
1090 if self.done {
1091 return Ok(None);
1092 }
1093 seed.deserialize(de::value::StrDeserializer::<Error>::new(self.end_key))
1094 .map(Some)
1095 }
1096
1097 fn next_value_seed<V: de::DeserializeSeed<'de>>(&mut self, seed: V) -> Result<V::Value> {
1098 if self.done {
1099 return Err(Error::ExpectedDifferentLength {
1100 expected: String::from("map of length 1"),
1101 found: 2,
1102 });
1103 }
1104 self.done = true;
1105 seed.deserialize(NumberDeserializer(self.end))
1106 }
1107}
1108
1109impl<'de, 'a> de::SeqAccess<'de> for CommaSeparated<'a, 'de> {
1110 type Error = Error;
1111
1112 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
1113 where
1114 T: DeserializeSeed<'de>,
1115 {
1116 if self.has_element()? {
1117 let res = guard_recursion! { self.de => seed.deserialize(&mut *self.de)? };
1118
1119 self.had_comma = self.de.parser.comma()?;
1120
1121 Ok(Some(res))
1122 } else {
1123 Ok(None)
1124 }
1125 }
1126}
1127
1128impl<'de, 'a> de::MapAccess<'de> for CommaSeparated<'a, 'de> {
1129 type Error = Error;
1130
1131 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
1132 where
1133 K: DeserializeSeed<'de>,
1134 {
1135 if self.has_element()? {
1136 self.inside_internally_tagged_enum = is_serde_tag_or_content::<K::Value>();
1137
1138 match self.terminator {
1139 Terminator::Struct => guard_recursion! { self.de =>
1140 seed.deserialize(&mut id::Deserializer::new(&mut *self.de, false)).map(Some)
1141 },
1142 Terminator::MapAsStruct => guard_recursion! { self.de =>
1143 seed.deserialize(&mut id::Deserializer::new(&mut *self.de, true)).map(Some)
1144 },
1145 _ => guard_recursion! { self.de => seed.deserialize(&mut *self.de).map(Some) },
1146 }
1147 } else {
1148 Ok(None)
1149 }
1150 }
1151
1152 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
1153 where
1154 V: DeserializeSeed<'de>,
1155 {
1156 self.de.parser.skip_ws()?;
1157
1158 if self.de.parser.consume_char(':') {
1159 self.de.parser.skip_ws()?;
1160
1161 let res = if self.inside_internally_tagged_enum && !is_serde_content::<V::Value>() {
1162 guard_recursion! { self.de =>
1163 seed.deserialize(&mut tag::Deserializer::new(&mut *self.de))?
1164 }
1165 } else {
1166 guard_recursion! { self.de =>
1167 seed.deserialize(&mut *self.de)?
1168 }
1169 };
1170
1171 self.had_comma = self.de.parser.comma()?;
1172
1173 Ok(res)
1174 } else {
1175 Err(Error::ExpectedMapColon)
1176 }
1177 }
1178}
1179
1180struct Enum<'a, 'de: 'a> {
1181 de: &'a mut Deserializer<'de>,
1182}
1183
1184impl<'a, 'de> Enum<'a, 'de> {
1185 fn new(de: &'a mut Deserializer<'de>) -> Self {
1186 Enum { de }
1187 }
1188}
1189
1190impl<'de, 'a> de::EnumAccess<'de> for Enum<'a, 'de> {
1191 type Error = Error;
1192 type Variant = Self;
1193
1194 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)>
1195 where
1196 V: DeserializeSeed<'de>,
1197 {
1198 self.de.parser.skip_ws()?;
1199
1200 let value = guard_recursion! { self.de => seed.deserialize(&mut *self.de)? };
1201
1202 Ok((value, self))
1203 }
1204}
1205
1206impl<'de, 'a> de::VariantAccess<'de> for Enum<'a, 'de> {
1207 type Error = Error;
1208
1209 fn unit_variant(self) -> Result<()> {
1210 Ok(())
1211 }
1212
1213 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
1214 where
1215 T: DeserializeSeed<'de>,
1216 {
1217 let newtype_variant = self.de.last_identifier;
1218
1219 self.de.parser.skip_ws()?;
1220
1221 if self.de.parser.consume_char('(') {
1222 self.de.parser.skip_ws()?;
1223
1224 self.de.newtype_variant = self
1225 .de
1226 .parser
1227 .exts
1228 .contains(Extensions::UNWRAP_VARIANT_NEWTYPES);
1229
1230 let val = guard_recursion! { self.de =>
1231 seed
1232 .deserialize(&mut *self.de)
1233 .map_err(|err| struct_error_name(err, newtype_variant))?
1234 };
1235
1236 self.de.newtype_variant = false;
1237
1238 self.de.parser.comma()?;
1239
1240 if self.de.parser.consume_char(')') {
1241 Ok(val)
1242 } else {
1243 Err(Error::ExpectedStructLikeEnd)
1244 }
1245 } else {
1246 Err(Error::ExpectedStructLike)
1247 }
1248 }
1249
1250 fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value>
1251 where
1252 V: Visitor<'de>,
1253 {
1254 self.de.parser.skip_ws()?;
1255
1256 self.de.deserialize_tuple(len, visitor)
1257 }
1258
1259 fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value>
1260 where
1261 V: Visitor<'de>,
1262 {
1263 let struct_variant = self.de.last_identifier;
1264
1265 self.de.parser.skip_ws()?;
1266
1267 self.de
1268 .handle_struct_after_name("", visitor)
1269 .map_err(|err| struct_error_name(err, struct_variant))
1270 }
1271}
1272
1273fn struct_error_name(error: Error, name: Option<&str>) -> Error {
1274 match error {
1275 Error::NoSuchStructField {
1276 expected,
1277 found,
1278 outer: None,
1279 } => Error::NoSuchStructField {
1280 expected,
1281 found,
1282 outer: name.map(ToOwned::to_owned),
1283 },
1284 Error::MissingStructField { field, outer: None } => Error::MissingStructField {
1285 field,
1286 outer: name.map(ToOwned::to_owned),
1287 },
1288 Error::DuplicateStructField { field, outer: None } => Error::DuplicateStructField {
1289 field,
1290 outer: name.map(ToOwned::to_owned),
1291 },
1292 e => e,
1293 }
1294}
1295
1296struct SerdeEnumContent<'a, 'de: 'a> {
1297 de: &'a mut Deserializer<'de>,
1298 ident: Option<&'a str>,
1299}
1300
1301impl<'de, 'a> de::MapAccess<'de> for SerdeEnumContent<'a, 'de> {
1302 type Error = Error;
1303
1304 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
1305 where
1306 K: DeserializeSeed<'de>,
1307 {
1308 self.ident
1309 .take()
1310 .map(|ident| seed.deserialize(de::value::StrDeserializer::new(ident)))
1311 .transpose()
1312 }
1313
1314 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
1315 where
1316 V: DeserializeSeed<'de>,
1317 {
1318 self.de.parser.skip_ws()?;
1319
1320 let old_serde_content_newtype = self.de.serde_content_newtype;
1321 self.de.serde_content_newtype = true;
1322 let result = seed.deserialize(&mut *self.de);
1323 self.de.serde_content_newtype = old_serde_content_newtype;
1324
1325 result
1326 }
1327}
1328
1329fn is_serde_content<T>() -> bool {
1330 #[derive(serde_derive::Deserialize)]
1331 enum A {}
1332 type B = A;
1333
1334 #[derive(serde_derive::Deserialize)]
1335 #[serde(untagged)]
1336 enum UntaggedEnum {
1337 A(A),
1338 B(B),
1339 }
1340
1341 struct TypeIdDeserializer;
1342
1343 impl<'de> de::Deserializer<'de> for TypeIdDeserializer {
1344 type Error = TypeIdError;
1345
1346 fn deserialize_any<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value, Self::Error> {
1347 Err(TypeIdError(typeid::of::<V::Value>()))
1348 }
1349
1350 serde::forward_to_deserialize_any! {
1351 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
1352 bytes byte_buf option unit unit_struct newtype_struct seq tuple
1353 tuple_struct map struct enum identifier ignored_any
1354 }
1355 }
1356
1357 #[derive(Debug)]
1358 struct TypeIdError(core::any::TypeId);
1359
1360 impl core::fmt::Display for TypeIdError {
1361 fn fmt(&self, _fmt: &mut core::fmt::Formatter) -> core::fmt::Result {
1362 Ok(())
1363 }
1364 }
1365
1366 impl de::Error for TypeIdError {
1367 #[allow(clippy::unreachable)]
1368 fn custom<T: core::fmt::Display>(_msg: T) -> Self {
1369 unreachable!()
1370 }
1371 }
1372
1373 impl de::StdError for TypeIdError {}
1374
1375 fn type_id_of_untagged_enum_default_buffer() -> core::any::TypeId {
1376 static TYPE_ID: once_cell::race::OnceBox<core::any::TypeId> =
1377 once_cell::race::OnceBox::new();
1378
1379 *TYPE_ID.get_or_init(|| match Deserialize::deserialize(TypeIdDeserializer) {
1380 Ok(UntaggedEnum::A(void) | UntaggedEnum::B(void)) => match void {},
1381 Err(TypeIdError(typeid)) => alloc::boxed::Box::new(typeid),
1382 })
1383 }
1384
1385 typeid::of::<T>() == type_id_of_untagged_enum_default_buffer()
1386}
1387
1388fn is_serde_tag_or_content<T>() -> bool {
1389 #[derive(serde_derive::Deserialize)]
1390 enum A {}
1391
1392 #[derive(serde_derive::Deserialize)]
1393 #[serde(tag = "tag")]
1394 enum InternallyTaggedEnum {
1395 A { a: A },
1396 }
1397
1398 struct TypeIdDeserializer;
1399
1400 impl<'de> de::Deserializer<'de> for TypeIdDeserializer {
1401 type Error = TypeIdError;
1402
1403 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1404 where
1405 V: Visitor<'de>,
1406 {
1407 visitor.visit_map(self)
1408 }
1409
1410 serde::forward_to_deserialize_any! {
1411 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
1412 bytes byte_buf option unit unit_struct newtype_struct seq tuple
1413 tuple_struct map struct enum identifier ignored_any
1414 }
1415 }
1416
1417 impl<'de> de::MapAccess<'de> for TypeIdDeserializer {
1418 type Error = TypeIdError;
1419
1420 fn next_key_seed<K: DeserializeSeed<'de>>(
1421 &mut self,
1422 _seed: K,
1423 ) -> Result<Option<K::Value>, Self::Error> {
1424 Err(TypeIdError(typeid::of::<K::Value>()))
1425 }
1426
1427 #[allow(clippy::unreachable)]
1428 fn next_value_seed<V: DeserializeSeed<'de>>(
1429 &mut self,
1430 _seed: V,
1431 ) -> Result<V::Value, Self::Error> {
1432 unreachable!()
1433 }
1434 }
1435
1436 #[derive(Debug)]
1437 struct TypeIdError(core::any::TypeId);
1438
1439 impl core::fmt::Display for TypeIdError {
1440 fn fmt(&self, _fmt: &mut core::fmt::Formatter) -> core::fmt::Result {
1441 Ok(())
1442 }
1443 }
1444
1445 impl de::Error for TypeIdError {
1446 #[allow(clippy::unreachable)]
1447 fn custom<T: core::fmt::Display>(_msg: T) -> Self {
1448 unreachable!()
1449 }
1450 }
1451
1452 impl de::StdError for TypeIdError {}
1453
1454 fn type_id_of_internally_tagged_enum_default_tag_or_buffer() -> core::any::TypeId {
1455 static TYPE_ID: once_cell::race::OnceBox<core::any::TypeId> =
1456 once_cell::race::OnceBox::new();
1457
1458 *TYPE_ID.get_or_init(|| match Deserialize::deserialize(TypeIdDeserializer) {
1459 Ok(InternallyTaggedEnum::A { a: void }) => match void {},
1460 Err(TypeIdError(typeid)) => alloc::boxed::Box::new(typeid),
1461 })
1462 }
1463
1464 typeid::of::<T>() == type_id_of_internally_tagged_enum_default_tag_or_buffer()
1465}