1use super::access::{MapAccess, SavedMapAccess, SavedSeqAccess, SeqAccess, VariantAccess};
2#[cfg(feature = "std")]
3use super::read::IoRead;
4use super::read::{Read, Reference, SliceRead, StrRead};
5use super::{parser_number::ParserNumber, stream_deserializer::StreamDeserializer};
6use crate::error::{Error, ErrorCode, Result};
7#[cfg(feature = "float_roundtrip")]
8use crate::lexical;
9use alloc::string::String;
10#[cfg(feature = "float_roundtrip")]
11use core::iter;
12use core::marker::PhantomData;
13use serde::de::{self, Expected, Unexpected};
14
15#[cfg(feature = "arbitrary_precision")]
16use crate::number::NumberDeserializer;
17
18macro_rules! overflow {
19 ($a:ident * 10 + $b:ident, $c:expr) => {
20 match $c {
21 c => $a >= c / 10 && ($a > c / 10 || $b > c % 10),
22 }
23 };
24}
25
26macro_rules! deserialize_number {
27 ($method:ident) => {
28 deserialize_number!($method, deserialize_number);
29 };
30
31 ($method:ident, $using:ident) => {
32 #[inline]
33 fn $method<V>(self, visitor: V) -> Result<V::Value>
34 where
35 V: de::Visitor<'de>,
36 {
37 self.$using(visitor)
38 }
39 };
40}
41
42#[cfg(not(feature = "unbounded_depth"))]
43macro_rules! if_checking_recursion_limit {
44 ($($body:tt)*) => {
45 $($body)*
46 };
47}
48
49#[cfg(feature = "unbounded_depth")]
50macro_rules! if_checking_recursion_limit {
51 ($this:ident $($body:tt)*) => {
52 if !$this.disable_recursion_limit {
53 $this $($body)*
54 }
55 };
56}
57
58macro_rules! check_recursion {
59 ($this:ident $($body:tt)*) => {
60 if_checking_recursion_limit! {
61 $this.remaining_depth -= 1;
62 if $this.remaining_depth == 0 {
63 return Err($this.peek_error(ErrorCode::RecursionLimitExceeded));
64 }
65 }
66
67 $this $($body)*
68
69 if_checking_recursion_limit! {
70 $this.remaining_depth += 1;
71 }
72 };
73}
74
75#[cfg(not(feature = "float_roundtrip"))]
76static POW10: [f64; 309] = [
77 1e000, 1e001, 1e002, 1e003, 1e004, 1e005, 1e006, 1e007, 1e008, 1e009, 1e010, 1e011, 1e012, 1e013, 1e014, 1e015, 1e016, 1e017, 1e018, 1e019, 1e020, 1e021, 1e022, 1e023, 1e024, 1e025, 1e026, 1e027, 1e028, 1e029, 1e030, 1e031, 1e032, 1e033, 1e034, 1e035, 1e036, 1e037, 1e038, 1e039, 1e040, 1e041, 1e042, 1e043, 1e044, 1e045, 1e046, 1e047, 1e048, 1e049, 1e050, 1e051, 1e052, 1e053, 1e054, 1e055, 1e056, 1e057, 1e058, 1e059, 1e060, 1e061, 1e062, 1e063, 1e064, 1e065, 1e066, 1e067, 1e068, 1e069, 1e070, 1e071, 1e072, 1e073, 1e074, 1e075, 1e076, 1e077, 1e078, 1e079, 1e080, 1e081, 1e082, 1e083, 1e084, 1e085, 1e086, 1e087, 1e088, 1e089, 1e090, 1e091, 1e092, 1e093, 1e094, 1e095, 1e096, 1e097, 1e098, 1e099, 1e100, 1e101, 1e102, 1e103, 1e104, 1e105, 1e106, 1e107, 1e108, 1e109, 1e110, 1e111, 1e112, 1e113, 1e114, 1e115, 1e116, 1e117, 1e118, 1e119, 1e120, 1e121, 1e122, 1e123, 1e124, 1e125, 1e126, 1e127, 1e128, 1e129, 1e130, 1e131, 1e132, 1e133, 1e134, 1e135, 1e136, 1e137, 1e138, 1e139, 1e140, 1e141, 1e142, 1e143, 1e144, 1e145, 1e146, 1e147, 1e148, 1e149, 1e150, 1e151, 1e152, 1e153, 1e154, 1e155, 1e156, 1e157, 1e158, 1e159, 1e160, 1e161, 1e162, 1e163, 1e164, 1e165, 1e166, 1e167, 1e168, 1e169, 1e170, 1e171, 1e172, 1e173, 1e174, 1e175, 1e176, 1e177, 1e178, 1e179, 1e180, 1e181, 1e182, 1e183, 1e184, 1e185, 1e186, 1e187, 1e188, 1e189, 1e190, 1e191, 1e192, 1e193, 1e194, 1e195, 1e196, 1e197, 1e198, 1e199, 1e200, 1e201, 1e202, 1e203, 1e204, 1e205, 1e206, 1e207, 1e208, 1e209, 1e210, 1e211, 1e212, 1e213, 1e214, 1e215, 1e216, 1e217, 1e218, 1e219, 1e220, 1e221, 1e222, 1e223, 1e224, 1e225, 1e226, 1e227, 1e228, 1e229, 1e230, 1e231, 1e232, 1e233, 1e234, 1e235, 1e236, 1e237, 1e238, 1e239, 1e240, 1e241, 1e242, 1e243, 1e244, 1e245, 1e246, 1e247, 1e248, 1e249, 1e250, 1e251, 1e252, 1e253, 1e254, 1e255, 1e256, 1e257, 1e258, 1e259, 1e260, 1e261, 1e262, 1e263, 1e264, 1e265, 1e266, 1e267, 1e268, 1e269, 1e270, 1e271, 1e272, 1e273, 1e274, 1e275, 1e276, 1e277, 1e278, 1e279, 1e280, 1e281, 1e282, 1e283, 1e284, 1e285, 1e286, 1e287, 1e288, 1e289, 1e290, 1e291, 1e292, 1e293, 1e294, 1e295, 1e296, 1e297, 1e298, 1e299, 1e300, 1e301, 1e302, 1e303, 1e304, 1e305, 1e306, 1e307, 1e308,
108];
109
110pub struct Deserializer<R> {
112 pub(crate) read: R,
113 pub(crate) remaining_depth: u8,
114 #[cfg(feature = "float_roundtrip")]
115 single_precision: bool,
116 #[cfg(feature = "unbounded_depth")]
117 disable_recursion_limit: bool,
118}
119
120impl<'de, R> Deserializer<R>
121where
122 R: Read<'de>,
123{
124 pub fn new(read: R) -> Self {
133 Deserializer {
134 read,
135 remaining_depth: 128,
136 #[cfg(feature = "float_roundtrip")]
137 single_precision: false,
138 #[cfg(feature = "unbounded_depth")]
139 disable_recursion_limit: false,
140 }
141 }
142}
143
144#[cfg(feature = "std")]
145impl<R> Deserializer<IoRead<R>>
146where
147 R: crate::io::Read,
148{
149 pub fn from_reader(reader: R) -> Self {
155 Deserializer::new(IoRead::new(reader))
156 }
157}
158
159impl<'a> Deserializer<SliceRead<'a>> {
160 pub fn from_slice(bytes: &'a [u8]) -> Self {
162 Deserializer::new(SliceRead::new(bytes))
163 }
164}
165
166impl<'a> Deserializer<StrRead<'a>> {
167 pub fn from_str(s: &'a str) -> Self {
169 Deserializer::new(StrRead::new(s))
170 }
171}
172
173pub(crate) enum PreParser {
174 SavedMap,
175 Seq,
176 SavedSeq(SavedType),
177}
178
179#[derive(PartialEq)]
180pub(crate) enum SavedType {
181 Str,
182 Bytes,
183 Number,
184 FloatNumber,
185 None,
187}
188
189impl<'de, R: Read<'de>> Deserializer<R> {
190 pub fn end(&mut self) -> Result<()> {
194 match self.parse_whitespace()? {
195 Some(_) => Err(self.peek_error(ErrorCode::TrailingCharacters)),
196 None => Ok(()),
197 }
198 }
199
200 pub fn into_iter<T>(self) -> StreamDeserializer<'de, R, T>
202 where
203 T: de::Deserialize<'de>,
204 {
205 let offset = self.read.byte_offset();
208 StreamDeserializer {
209 de: self,
210 offset,
211 failed: false,
212 output: PhantomData,
213 lifetime: PhantomData,
214 }
215 }
216
217 #[cfg(feature = "unbounded_depth")]
261 #[cfg_attr(docsrs, doc(cfg(feature = "unbounded_depth")))]
262 pub fn disable_recursion_limit(&mut self) {
263 self.disable_recursion_limit = true;
264 }
265
266 #[inline]
267 pub(crate) fn peek(&mut self) -> Result<Option<u8>> {
268 self.read.peek()
269 }
270
271 #[inline]
272 fn peek_or_null(&mut self) -> Result<u8> {
273 Ok(self.peek()?.unwrap_or(b'\x00'))
274 }
275
276 #[inline]
277 pub(crate) fn eat_char(&mut self) {
278 self.read.discard();
279 }
280
281 #[inline]
282 pub(crate) fn next_char(&mut self) -> Result<Option<u8>> {
283 self.read.next()
284 }
285
286 #[inline]
287 fn next_char_or_null(&mut self) -> Result<u8> {
288 Ok(self.next_char()?.unwrap_or(b'\x00'))
289 }
290
291 #[cold]
293 pub(crate) fn error(&self, reason: ErrorCode) -> Error {
294 let position = self.read.position();
295 Error::syntax(reason, position.line, position.column)
296 }
297
298 #[cold]
300 pub(crate) fn peek_error(&self, reason: ErrorCode) -> Error {
301 let position = self.read.peek_position();
302 Error::syntax(reason, position.line, position.column)
303 }
304
305 pub(crate) fn parse_whitespace(&mut self) -> Result<Option<u8>> {
308 loop {
309 match self.peek()? {
310 Some(ch) if ch < 0x21 => {
312 self.eat_char();
313 }
314 other => {
315 return Ok(other);
316 }
317 }
318 }
319 }
320
321 #[inline]
322 fn pre_parser_match(&mut self) -> Result<PreParser> {
323 loop {
324 match self.peek()? {
325 Some(b':' | b'{' | b'[') => {
326 return Ok(PreParser::SavedMap);
327 }
328 Some(b'=') => return Ok(PreParser::SavedSeq(SavedType::Str)),
329 Some(b'~') => return Ok(PreParser::SavedSeq(SavedType::Bytes)),
330 Some(b'.') => return Ok(PreParser::SavedSeq(SavedType::FloatNumber)),
331 Some(b'}' | b']' | b' ' | b'\n' | b'\t' | b'\r') | None => {
335 return Ok(PreParser::SavedSeq(SavedType::Number));
336 }
337 _ => self.eat_char(),
338 }
339 }
340 }
341
342 pub(crate) fn any_after_x7b(&mut self) -> Result<PreParser> {
345 if let Some(ch) = self.parse_whitespace()? {
346 if ch == b'{' || ch == b'[' || ch == b'-' || ch == b't' || ch == b'f' {
347 return Ok(PreParser::Seq);
348 }
349 self.read.save_start();
350 } else {
351 return Err(self.error(ErrorCode::EofWhileParsingValue));
352 }
353 let ret = self.pre_parser_match();
354 self.read.save_end();
355 ret
356 }
357
358 #[inline]
360 pub(crate) fn end_of_str_or_bytes(&mut self) -> Result<()> {
361 match self.peek()? {
362 Some(b'}' | b']' | b' ' | b'\n' | b'\t' | b'\r') | None => Ok(()),
363 _ => Err(self.peek_error(ErrorCode::UnexpectedEndOfString)),
364 }
365 }
366
367 #[inline]
368 pub(crate) fn deserialize_str_by_len<V>(&mut self, visitor: V, len: usize) -> Result<V::Value>
369 where
370 V: de::Visitor<'de>,
371 {
372 self.eat_char();
373 let res = visitor.visit_borrowed_str(self.read.read_str(len)?);
374 self.end_of_str_or_bytes()?;
375 res
376 }
377
378 #[inline]
379 pub(crate) fn deserialize_bytes_by_len<V>(&mut self, visitor: V, len: usize) -> Result<V::Value>
380 where
381 V: de::Visitor<'de>,
382 {
383 self.eat_char();
384 let res = visitor.visit_borrowed_bytes(self.read.read_slice(len)?);
385 self.end_of_str_or_bytes()?;
386 res
387 }
388
389 pub(crate) fn any_map_value<V>(&mut self, visitor: V) -> Result<V::Value>
391 where
392 V: de::Visitor<'de>,
393 {
394 let parsed_int = self.read.parse_int_any_pos()?;
395 let ret = match self.peek()? {
396 Some(b'=') => self.deserialize_str_by_len(visitor, parsed_int as usize),
397 Some(b'~') => self.deserialize_bytes_by_len(visitor, parsed_int as usize),
398 Some(b'.') => visitor.visit_f64(self.parse_decimal(true, parsed_int, 0)?),
399 Some(b'}' | b']' | b' ' | b'\n' | b'\t' | b'\r') | None => {
403 visitor.visit_u64(parsed_int)
404 }
405 Some(_) => Err(self.error(ErrorCode::ExpectedSomeIdent)), };
407 self.read.clear_saved();
408 ret
409 }
410
411 #[cold]
412 pub(crate) fn peek_invalid_type(&mut self, exp: &dyn Expected) -> Error {
413 let err = match self.peek_or_null().unwrap_or(b'\x00') {
414 b'n' => {
415 self.eat_char();
416 de::Error::invalid_type(Unexpected::Unit, exp)
420 }
421 b't' => {
422 self.eat_char();
423 de::Error::invalid_type(Unexpected::Bool(true), exp)
427 }
428 b'f' => {
429 self.eat_char();
430 de::Error::invalid_type(Unexpected::Bool(false), exp)
434 }
435 b'-' => {
436 self.eat_char();
437 match self.parse_any_number(false) {
438 Ok(n) => n.invalid_type(exp),
439 Err(err) => return err,
440 }
441 }
442 b'0'..=b'9' => match self.parse_any_number(true) {
443 Ok(n) => n.invalid_type(exp),
444 Err(err) => return err,
445 },
446 b'[' => de::Error::invalid_type(Unexpected::Seq, exp),
455 b'{' => de::Error::invalid_type(Unexpected::Map, exp),
456 _ => self.peek_error(ErrorCode::ExpectedSomeValue),
457 };
458
459 self.fix_position(err)
460 }
461
462 pub(crate) fn deserialize_number<'any, V>(&mut self, visitor: V) -> Result<V::Value>
463 where
464 V: de::Visitor<'any>,
465 {
466 let peek = match self.parse_whitespace()? {
467 Some(b) => b,
468 None => {
469 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
470 }
471 };
472
473 let value = match peek {
474 b'-' => {
475 self.eat_char();
476 self.parse_integer(false)?.visit(visitor)
477 }
478 b'0'..=b'9' => self.parse_integer(true)?.visit(visitor),
479 _ => Err(self.peek_invalid_type(&visitor)),
480 };
481
482 match value {
483 Ok(value) => Ok(value),
484 Err(err) => Err(self.fix_position(err)),
485 }
486 }
487
488 #[cfg(feature = "float_roundtrip")]
489 pub(crate) fn do_deserialize_f32<'any, V>(&mut self, visitor: V) -> Result<V::Value>
490 where
491 V: de::Visitor<'any>,
492 {
493 self.single_precision = true;
494 let val = self.deserialize_number(visitor);
495 self.single_precision = false;
496 val
497 }
498
499 pub(crate) fn do_deserialize_i128<'any, V>(&mut self, visitor: V) -> Result<V::Value>
501 where
502 V: de::Visitor<'any>,
503 {
504 let mut buf = String::new();
505
506 match self.parse_whitespace()? {
507 Some(b'-') => {
508 self.eat_char();
509 buf.push('-');
510 }
511 Some(_) => {}
512 None => {
513 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
514 }
515 };
516
517 self.scan_integer128(&mut buf)?;
518
519 let value = match buf.parse() {
520 Ok(int) => visitor.visit_i128(int),
521 Err(_) => {
522 return Err(self.error(ErrorCode::NumberOutOfRange));
523 }
524 };
525
526 match value {
527 Ok(value) => Ok(value),
528 Err(err) => Err(self.fix_position(err)),
529 }
530 }
531
532 pub(crate) fn do_deserialize_u128<'any, V>(&mut self, visitor: V) -> Result<V::Value>
534 where
535 V: de::Visitor<'any>,
536 {
537 match self.parse_whitespace()? {
538 Some(b'-') => {
539 return Err(self.peek_error(ErrorCode::NumberOutOfRange));
540 }
541 Some(_) => {}
542 None => {
543 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
544 }
545 }
546
547 let mut buf = String::new();
548 self.scan_integer128(&mut buf)?;
549
550 let value = match buf.parse() {
551 Ok(int) => visitor.visit_u128(int),
552 Err(_) => {
553 return Err(self.error(ErrorCode::NumberOutOfRange));
554 }
555 };
556
557 match value {
558 Ok(value) => Ok(value),
559 Err(err) => Err(self.fix_position(err)),
560 }
561 }
562
563 fn scan_integer128(&mut self, buf: &mut String) -> Result<()> {
565 match self.next_char_or_null()? {
566 b'0' => {
567 buf.push('0');
568 match self.peek_or_null()? {
570 b'0'..=b'9' => Err(self.peek_error(ErrorCode::InvalidNumber)),
571 _ => Ok(()),
572 }
573 }
574 c @ b'1'..=b'9' => {
575 buf.push(c as char);
576 while let c @ b'0'..=b'9' = self.peek_or_null()? {
577 self.eat_char();
578 buf.push(c as char);
579 }
580 Ok(())
581 }
582 _ => Err(self.error(ErrorCode::InvalidNumber)),
583 }
584 }
585
586 #[cold]
587 pub(crate) fn fix_position(&self, err: Error) -> Error {
588 err.fix_position(move |code| self.error(code))
589 }
590
591 fn parse_integer(&mut self, positive: bool) -> Result<ParserNumber> {
670 let significand = self.read.parse_int_any_pos()?;
672 self.parse_number(positive, significand)
673 }
677
678 #[inline]
679 fn parse_number(&mut self, positive: bool, significand: u64) -> Result<ParserNumber> {
680 Ok(match self.peek_or_null()? {
681 b'.' => ParserNumber::F64(self.parse_decimal(positive, significand, 0)?),
682 b'e' | b'E' => ParserNumber::F64(self.parse_exponent(positive, significand, 0)?),
683 _ => {
684 if positive {
685 ParserNumber::U64(significand)
686 } else {
687 let neg = (significand as i64).wrapping_neg();
688
689 if neg >= 0 {
691 ParserNumber::F64(-(significand as f64))
692 } else {
693 ParserNumber::I64(neg)
694 }
695 }
696 }
697 })
698 }
699
700 pub(crate) fn parse_decimal(
701 &mut self,
702 positive: bool,
703 mut significand: u64,
704 exponent_before_decimal_point: i32,
705 ) -> Result<f64> {
706 self.eat_char();
707
708 let mut exponent_after_decimal_point = 0;
709 while let c @ b'0'..=b'9' = self.peek_or_null()? {
710 let digit = (c & 0xF) as u64;
711
712 if overflow!(significand * 10 + digit, u64::MAX) {
713 let exponent = exponent_before_decimal_point + exponent_after_decimal_point;
714 return self.parse_decimal_overflow(positive, significand, exponent);
715 }
716
717 self.eat_char();
718 significand = significand * 10 + digit;
719 exponent_after_decimal_point -= 1;
720 }
721
722 if exponent_after_decimal_point == 0 {
724 match self.peek()? {
725 Some(_) => return Err(self.peek_error(ErrorCode::InvalidNumber)),
726 None => return Err(self.peek_error(ErrorCode::EofWhileParsingValue)),
727 }
728 }
729
730 let exponent = exponent_before_decimal_point + exponent_after_decimal_point;
731 match self.peek_or_null()? {
732 b'e' | b'E' => self.parse_exponent(positive, significand, exponent),
733 _ => self.f64_from_parts(positive, significand, exponent),
734 }
735 }
736
737 fn parse_exponent(
738 &mut self,
739 positive: bool,
740 significand: u64,
741 starting_exp: i32,
742 ) -> Result<f64> {
743 self.eat_char();
744
745 let positive_exp = match self.peek_or_null()? {
746 b'+' => {
747 self.eat_char();
748 true
749 }
750 b'-' => {
751 self.eat_char();
752 false
753 }
754 _ => true,
755 };
756
757 let next = match self.next_char()? {
758 Some(b) => b,
759 None => {
760 return Err(self.error(ErrorCode::EofWhileParsingValue));
761 }
762 };
763
764 let mut exp = match next {
766 c @ b'0'..=b'9' => (c & 0xF) as i32,
767 _ => {
768 return Err(self.error(ErrorCode::InvalidNumber));
769 }
770 };
771
772 while let c @ b'0'..=b'9' = self.peek_or_null()? {
773 self.eat_char();
774 let digit = (c & 0xF) as i32;
775
776 if overflow!(exp * 10 + digit, i32::MAX) {
777 let zero_significand = significand == 0;
778 return self.parse_exponent_overflow(positive, zero_significand, positive_exp);
779 }
780
781 exp = exp * 10 + digit;
782 }
783
784 let final_exp = if positive_exp {
785 starting_exp.saturating_add(exp)
786 } else {
787 starting_exp.saturating_sub(exp)
788 };
789
790 self.f64_from_parts(positive, significand, final_exp)
791 }
792
793 #[cfg(feature = "float_roundtrip")]
794 fn f64_from_parts(&mut self, positive: bool, significand: u64, exponent: i32) -> Result<f64> {
795 let f = if self.single_precision {
796 lexical::parse_concise_float::<f32>(significand, exponent) as f64
797 } else {
798 lexical::parse_concise_float::<f64>(significand, exponent)
799 };
800
801 if f.is_infinite() {
802 Err(self.error(ErrorCode::NumberOutOfRange))
803 } else {
804 Ok(if positive { f } else { -f })
805 }
806 }
807
808 #[cfg(not(feature = "float_roundtrip"))]
809 fn f64_from_parts(
810 &mut self,
811 positive: bool,
812 significand: u64,
813 mut exponent: i32,
814 ) -> Result<f64> {
815 let mut f = significand as f64;
816 loop {
817 match POW10.get(exponent.wrapping_abs() as usize) {
818 Some(&pow) => {
819 if exponent >= 0 {
820 f *= pow;
821 if f.is_infinite() {
822 return Err(self.error(ErrorCode::NumberOutOfRange));
823 }
824 } else {
825 f /= pow;
826 }
827 break;
828 }
829 None => {
830 if f == 0.0 {
831 break;
832 }
833 if exponent >= 0 {
834 return Err(self.error(ErrorCode::NumberOutOfRange));
835 }
836 f /= 1e308;
837 exponent += 308;
838 }
839 }
840 }
841 Ok(if positive { f } else { -f })
842 }
843
844 #[cfg(feature = "float_roundtrip")]
911 #[cold]
912 fn parse_long_decimal(&mut self, positive: bool, integer_end: usize) -> Result<f64> {
913 let mut at_least_one_digit = integer_end < self.scratch.len();
914 while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
915 self.scratch.push(c);
916 self.eat_char();
917 at_least_one_digit = true;
918 }
919
920 if !at_least_one_digit {
921 match tri!(self.peek()) {
922 Some(_) => return Err(self.peek_error(ErrorCode::InvalidNumber)),
923 None => return Err(self.peek_error(ErrorCode::EofWhileParsingValue)),
924 }
925 }
926
927 match tri!(self.peek_or_null()) {
928 b'e' | b'E' => self.parse_long_exponent(positive, integer_end),
929 _ => self.f64_long_from_parts(positive, integer_end, 0),
930 }
931 }
932
933 #[cfg(feature = "float_roundtrip")]
934 fn parse_long_exponent(&mut self, positive: bool, integer_end: usize) -> Result<f64> {
935 self.eat_char();
936
937 let positive_exp = match tri!(self.peek_or_null()) {
938 b'+' => {
939 self.eat_char();
940 true
941 }
942 b'-' => {
943 self.eat_char();
944 false
945 }
946 _ => true,
947 };
948
949 let next = match tri!(self.next_char()) {
950 Some(b) => b,
951 None => {
952 return Err(self.error(ErrorCode::EofWhileParsingValue));
953 }
954 };
955
956 let mut exp = match next {
958 c @ b'0'..=b'9' => (c & 0xF) as i32,
959 _ => {
960 return Err(self.error(ErrorCode::InvalidNumber));
961 }
962 };
963
964 while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
965 self.eat_char();
966 let digit = (c & 0xF) as i32;
967
968 if overflow!(exp * 10 + digit, i32::MAX) {
969 let zero_significand = self.scratch.iter().all(|&digit| digit == b'0');
970 return self.parse_exponent_overflow(positive, zero_significand, positive_exp);
971 }
972
973 exp = exp * 10 + digit;
974 }
975
976 let final_exp = if positive_exp { exp } else { -exp };
977
978 self.f64_long_from_parts(positive, integer_end, final_exp)
979 }
980
981 #[cfg(feature = "float_roundtrip")]
984 #[cold]
985 #[inline(never)]
986 fn parse_decimal_overflow(
987 &mut self,
988 positive: bool,
989 significand: u64,
990 exponent: i32,
991 ) -> Result<f64> {
992 let mut buffer = itoa::Buffer::new();
993 let significand = buffer.format(significand);
994 let fraction_digits = -exponent as usize;
995 self.scratch.clear();
996 if let Some(zeros) = fraction_digits.checked_sub(significand.len() + 1) {
997 self.scratch.extend(iter::repeat(b'0').take(zeros + 1));
998 }
999 self.scratch.extend_from_slice(significand.as_bytes());
1000 let integer_end = self.scratch.len() - fraction_digits;
1001 self.parse_long_decimal(positive, integer_end)
1002 }
1003
1004 #[cfg(not(feature = "float_roundtrip"))]
1005 #[cold]
1006 #[inline(never)]
1007 fn parse_decimal_overflow(
1008 &mut self,
1009 positive: bool,
1010 significand: u64,
1011 exponent: i32,
1012 ) -> Result<f64> {
1013 while let b'0'..=b'9' = self.peek_or_null()? {
1016 self.eat_char();
1017 }
1018
1019 match self.peek_or_null()? {
1020 b'e' | b'E' => self.parse_exponent(positive, significand, exponent),
1021 _ => self.f64_from_parts(positive, significand, exponent),
1022 }
1023 }
1024
1025 #[cold]
1028 #[inline(never)]
1029 fn parse_exponent_overflow(
1030 &mut self,
1031 positive: bool,
1032 zero_significand: bool,
1033 positive_exp: bool,
1034 ) -> Result<f64> {
1035 if !zero_significand && positive_exp {
1037 return Err(self.error(ErrorCode::NumberOutOfRange));
1038 }
1039
1040 while let b'0'..=b'9' = self.peek_or_null()? {
1041 self.eat_char();
1042 }
1043 Ok(if positive { 0.0 } else { -0.0 })
1044 }
1045
1046 #[cfg(feature = "float_roundtrip")]
1047 fn f64_long_from_parts(
1048 &mut self,
1049 positive: bool,
1050 integer_end: usize,
1051 exponent: i32,
1052 ) -> Result<f64> {
1053 let integer = &self.scratch[..integer_end];
1054 let fraction = &self.scratch[integer_end..];
1055
1056 let f = if self.single_precision {
1057 lexical::parse_truncated_float::<f32>(integer, fraction, exponent) as f64
1058 } else {
1059 lexical::parse_truncated_float::<f64>(integer, fraction, exponent)
1060 };
1061
1062 if f.is_infinite() {
1063 Err(self.error(ErrorCode::NumberOutOfRange))
1064 } else {
1065 Ok(if positive { f } else { -f })
1066 }
1067 }
1068
1069 pub(crate) fn parse_any_signed_number(&mut self) -> Result<ParserNumber> {
1071 unreachable!();
1072 }
1103
1104 #[cfg(not(feature = "arbitrary_precision"))]
1105 #[inline]
1106 pub(crate) fn parse_any_number(&mut self, positive: bool) -> Result<ParserNumber> {
1107 self.parse_integer(positive)
1108 }
1109
1110 #[cfg(feature = "arbitrary_precision")]
1111 fn parse_any_number(&mut self, positive: bool) -> Result<ParserNumber> {
1112 let mut buf = String::with_capacity(16);
1113 if !positive {
1114 buf.push('-');
1115 }
1116 self.scan_integer(&mut buf)?;
1117 if positive {
1118 if let Ok(unsigned) = buf.parse() {
1119 return Ok(ParserNumber::U64(unsigned));
1120 }
1121 } else {
1122 if let Ok(signed) = buf.parse() {
1123 return Ok(ParserNumber::I64(signed));
1124 }
1125 }
1126 Ok(ParserNumber::String(buf))
1127 }
1128
1129 #[cfg(feature = "arbitrary_precision")]
1130 fn scan_or_eof(&mut self, buf: &mut String) -> Result<u8> {
1131 match tri!(self.next_char()) {
1132 Some(b) => {
1133 buf.push(b as char);
1134 Ok(b)
1135 }
1136 None => Err(self.error(ErrorCode::EofWhileParsingValue)),
1137 }
1138 }
1139
1140 #[cfg(feature = "arbitrary_precision")]
1141 fn scan_integer(&mut self, buf: &mut String) -> Result<()> {
1142 match tri!(self.scan_or_eof(buf)) {
1143 b'0' => {
1144 match tri!(self.peek_or_null()) {
1146 b'0'..=b'9' => Err(self.peek_error(ErrorCode::InvalidNumber)),
1147 _ => self.scan_number(buf),
1148 }
1149 }
1150 b'1'..=b'9' => loop {
1151 match tri!(self.peek_or_null()) {
1152 c @ b'0'..=b'9' => {
1153 self.eat_char();
1154 buf.push(c as char);
1155 }
1156 _ => {
1157 return self.scan_number(buf);
1158 }
1159 }
1160 },
1161 _ => Err(self.error(ErrorCode::InvalidNumber)),
1162 }
1163 }
1164
1165 #[cfg(feature = "arbitrary_precision")]
1166 fn scan_number(&mut self, buf: &mut String) -> Result<()> {
1167 match tri!(self.peek_or_null()) {
1168 b'.' => self.scan_decimal(buf),
1169 e @ (b'e' | b'E') => self.scan_exponent(e as char, buf),
1170 _ => Ok(()),
1171 }
1172 }
1173
1174 #[cfg(feature = "arbitrary_precision")]
1175 fn scan_decimal(&mut self, buf: &mut String) -> Result<()> {
1176 self.eat_char();
1177 buf.push('.');
1178
1179 let mut at_least_one_digit = false;
1180 while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
1181 self.eat_char();
1182 buf.push(c as char);
1183 at_least_one_digit = true;
1184 }
1185
1186 if !at_least_one_digit {
1187 match tri!(self.peek()) {
1188 Some(_) => return Err(self.peek_error(ErrorCode::InvalidNumber)),
1189 None => return Err(self.peek_error(ErrorCode::EofWhileParsingValue)),
1190 }
1191 }
1192
1193 match tri!(self.peek_or_null()) {
1194 e @ (b'e' | b'E') => self.scan_exponent(e as char, buf),
1195 _ => Ok(()),
1196 }
1197 }
1198
1199 #[cfg(feature = "arbitrary_precision")]
1200 fn scan_exponent(&mut self, e: char, buf: &mut String) -> Result<()> {
1201 self.eat_char();
1202 buf.push(e);
1203
1204 match tri!(self.peek_or_null()) {
1205 b'+' => {
1206 self.eat_char();
1207 buf.push('+');
1208 }
1209 b'-' => {
1210 self.eat_char();
1211 buf.push('-');
1212 }
1213 _ => {}
1214 }
1215
1216 match tri!(self.scan_or_eof(buf)) {
1218 b'0'..=b'9' => {}
1219 _ => {
1220 return Err(self.error(ErrorCode::InvalidNumber));
1221 }
1222 }
1223
1224 while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
1225 self.eat_char();
1226 buf.push(c as char);
1227 }
1228
1229 Ok(())
1230 }
1231
1232 pub(crate) fn parse_object_colon(&mut self) -> Result<()> {
1233 match self.parse_whitespace()? {
1234 Some(b':') => {
1235 self.eat_char();
1236 Ok(())
1237 }
1238 Some(b'{' | b'[') => Ok(()), Some(_) => Err(self.peek_error(ErrorCode::ExpectedColon)),
1240 None => Err(self.peek_error(ErrorCode::EofWhileParsingObject)),
1241 }
1242 }
1243
1244 fn end_seq(&mut self) -> Result<()> {
1245 match self.parse_whitespace()? {
1246 Some(b']') => {
1247 self.eat_char();
1248 Ok(())
1249 }
1250 Some(_) => Err(self.peek_error(ErrorCode::TrailingCharacters)),
1258 None => Err(self.peek_error(ErrorCode::EofWhileParsingList)),
1259 }
1260 }
1261
1262 #[inline]
1263 pub(crate) fn end_seq_init(&mut self) -> Result<()> {
1264 match self.parse_whitespace()? {
1265 Some(_) => Err(self.peek_error(ErrorCode::TrailingCharacters)),
1266 None => Ok(()),
1267 }
1268 }
1269
1270 fn end_map(&mut self) -> Result<()> {
1271 match self.parse_whitespace()? {
1272 Some(b'}') => {
1273 self.eat_char();
1274 Ok(())
1275 }
1276 Some(_) => Err(self.peek_error(ErrorCode::TrailingCharacters)),
1278 None => Err(self.peek_error(ErrorCode::EofWhileParsingObject)),
1279 }
1280 }
1281
1282 #[inline]
1283 pub(crate) fn end_map_init(&mut self) -> Result<()> {
1284 match self.parse_whitespace()? {
1285 Some(_) => Err(self.peek_error(ErrorCode::TrailingCharacters)),
1286 None => Ok(()),
1287 }
1288 }
1289
1290 fn ignore_value(&mut self) -> Result<()> {
1291 self.read.clear_saved();
1292 let mut enclosing = None;
1293
1294 loop {
1295 let peek = match self.parse_whitespace()? {
1296 Some(b) => b,
1297 None => {
1298 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1299 }
1300 };
1301
1302 let frame = match peek {
1303 b'n' => {
1304 self.eat_char();
1305 None
1307 }
1308 b't' => {
1309 self.eat_char();
1310 None
1312 }
1313 b'f' => {
1314 self.eat_char();
1315 None
1317 }
1318 b'-' => {
1319 self.eat_char();
1320 self.ignore_integer()?;
1321 None
1322 }
1323 b'0'..=b'9' => {
1324 self.ignore_integer()?;
1325 None
1326 }
1327 frame @ b'{' | frame @ b'[' => {
1333 self.eat_char();
1337 Some(frame)
1338 }
1339 _ => return Err(self.peek_error(ErrorCode::ExpectedSomeValue)),
1340 };
1341
1342 let (mut accept_comma, frame) = match frame {
1343 Some(frame) => (false, frame),
1344 None => match enclosing.take() {
1345 Some(frame) => (true, frame),
1346 None => return Ok(()),
1349 },
1351 };
1352
1353 loop {
1354 match self.parse_whitespace()? {
1355 Some(b' ') if accept_comma => {
1356 self.eat_char();
1357 break;
1358 }
1359 Some(b']') if frame == b'[' => {}
1360 Some(b'}') if frame == b'{' => {}
1361 Some(_) => {
1362 if accept_comma {
1363 return Err(self.peek_error(match frame {
1364 b'[' => ErrorCode::ExpectedListCommaOrEnd,
1365 b'{' => ErrorCode::ExpectedObjectCommaOrEnd,
1366 _ => unreachable!(),
1367 }));
1368 } else {
1369 break;
1370 }
1371 }
1372 None => {
1373 return Err(self.peek_error(match frame {
1374 b'[' => ErrorCode::EofWhileParsingList,
1375 b'{' => ErrorCode::EofWhileParsingObject,
1376 _ => unreachable!(),
1377 }));
1378 }
1379 }
1380
1381 self.eat_char();
1382 accept_comma = true;
1387 }
1388
1389 if frame == b'{' || frame == b'[' {
1390 match self.parse_whitespace()? {
1391 Some(b'"') => self.eat_char(),
1392 Some(_) => return Err(self.peek_error(ErrorCode::KeyMustBeAString)),
1393 None => return Err(self.peek_error(ErrorCode::EofWhileParsingObject)),
1394 }
1395 self.read.ignore_str()?;
1396 match self.parse_whitespace()? {
1397 Some(b':') => self.eat_char(),
1398 Some(_) => return Err(self.peek_error(ErrorCode::ExpectedColon)),
1399 None => return Err(self.peek_error(ErrorCode::EofWhileParsingObject)),
1400 }
1401 }
1402
1403 enclosing = Some(frame);
1404 }
1405 }
1406
1407 fn ignore_integer(&mut self) -> Result<()> {
1408 match self.next_char_or_null()? {
1409 b'0' => {
1410 if let b'0'..=b'9' = self.peek_or_null()? {
1412 return Err(self.peek_error(ErrorCode::InvalidNumber));
1413 }
1414 }
1415 b'1'..=b'9' => {
1416 while let b'0'..=b'9' = self.peek_or_null()? {
1417 self.eat_char();
1418 }
1419 }
1420 _ => {
1421 return Err(self.error(ErrorCode::InvalidNumber));
1422 }
1423 }
1424
1425 match self.peek_or_null()? {
1426 b'.' => self.ignore_decimal(),
1427 b'e' | b'E' => self.ignore_exponent(),
1428 _ => Ok(()),
1429 }
1430 }
1431
1432 fn ignore_decimal(&mut self) -> Result<()> {
1433 self.eat_char();
1434
1435 let mut at_least_one_digit = false;
1436 while let b'0'..=b'9' = self.peek_or_null()? {
1437 self.eat_char();
1438 at_least_one_digit = true;
1439 }
1440
1441 if !at_least_one_digit {
1442 return Err(self.peek_error(ErrorCode::InvalidNumber));
1443 }
1444
1445 match self.peek_or_null()? {
1446 b'e' | b'E' => self.ignore_exponent(),
1447 _ => Ok(()),
1448 }
1449 }
1450
1451 fn ignore_exponent(&mut self) -> Result<()> {
1452 self.eat_char();
1453
1454 match self.peek_or_null()? {
1455 b'+' | b'-' => self.eat_char(),
1456 _ => {}
1457 }
1458
1459 match self.next_char_or_null()? {
1461 b'0'..=b'9' => {}
1462 _ => {
1463 return Err(self.error(ErrorCode::InvalidNumber));
1464 }
1465 }
1466
1467 while let b'0'..=b'9' = self.peek_or_null()? {
1468 self.eat_char();
1469 }
1470
1471 Ok(())
1472 }
1473
1474 #[cfg(feature = "raw_value")]
1475 fn deserialize_raw_value<V>(&mut self, visitor: V) -> Result<V::Value>
1476 where
1477 V: de::Visitor<'de>,
1478 {
1479 self.parse_whitespace()?;
1480 self.read.begin_raw_buffering();
1481 self.ignore_value()?;
1482 self.read.end_raw_buffering(visitor)
1483 }
1484}
1485
1486impl<'de, R: Read<'de>> de::Deserializer<'de> for &mut Deserializer<R> {
1487 type Error = Error;
1488
1489 #[inline]
1490 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
1491 where
1492 V: de::Visitor<'de>,
1493 {
1494 let peek = match self.parse_whitespace()? {
1495 Some(b) => b,
1496 None => {
1497 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1498 }
1499 };
1500
1501 let value = match peek {
1502 b'n' => {
1503 self.eat_char();
1504 visitor.visit_unit()
1506 }
1507 b't' => {
1508 self.eat_char();
1509 visitor.visit_bool(true)
1511 }
1512 b'f' => {
1513 self.eat_char();
1514 visitor.visit_bool(false)
1516 }
1517 b'-' => {
1518 self.eat_char();
1519 self.parse_any_number(false)?.visit(visitor)
1520 }
1521 b'{' | b'[' => {
1542 check_recursion! {
1543 self.eat_char();
1544 let value = match self.any_after_x7b()? {
1545 PreParser::SavedMap => {
1546 let value = visitor.visit_map(SavedMapAccess::new(self));
1547 (value, self.end_map())
1548 }
1549 PreParser::SavedSeq(v) => {
1550 let value = visitor.visit_seq(SavedSeqAccess::new(self, v));
1551 (value, self.end_seq())
1552 }
1553 PreParser::Seq => {
1554 let value = visitor.visit_seq(SeqAccess::new(self));
1555 (value, self.end_seq())
1556 }
1557 };
1558 }
1559 match value {
1560 (Ok(ret), Ok(())) => Ok(ret),
1561 (Err(err), _) | (_, Err(err)) => Err(err),
1562 }
1563 }
1564 _ => self.any_map_value(visitor),
1565 };
1566
1567 match value {
1568 Ok(value) => Ok(value),
1569 Err(err) => Err(self.fix_position(err)),
1575 }
1576 }
1577
1578 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
1579 where
1580 V: de::Visitor<'de>,
1581 {
1582 let peek = match self.parse_whitespace()? {
1583 Some(b) => b,
1584 None => {
1585 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1586 }
1587 };
1588
1589 let value = match peek {
1590 b't' => {
1591 self.eat_char();
1592 visitor.visit_bool(true)
1594 }
1595 b'f' => {
1596 self.eat_char();
1597 visitor.visit_bool(false)
1599 }
1600 _ => Err(self.peek_invalid_type(&visitor)),
1601 };
1602
1603 match value {
1604 Ok(value) => Ok(value),
1605 Err(err) => Err(self.fix_position(err)),
1606 }
1607 }
1608
1609 deserialize_number!(deserialize_i8);
1610 deserialize_number!(deserialize_i16);
1611 deserialize_number!(deserialize_i32);
1612 deserialize_number!(deserialize_i64);
1613 deserialize_number!(deserialize_u8);
1614 deserialize_number!(deserialize_u16);
1615 deserialize_number!(deserialize_u32);
1616 deserialize_number!(deserialize_u64);
1617 #[cfg(not(feature = "float_roundtrip"))]
1618 deserialize_number!(deserialize_f32);
1619 deserialize_number!(deserialize_f64);
1620
1621 #[cfg(feature = "float_roundtrip")]
1622 deserialize_number!(deserialize_f32, do_deserialize_f32);
1623 deserialize_number!(deserialize_i128, do_deserialize_i128);
1624 deserialize_number!(deserialize_u128, do_deserialize_u128);
1625
1626 #[inline]
1627 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
1628 where
1629 V: de::Visitor<'de>,
1630 {
1631 self.deserialize_str(visitor)
1632 }
1633
1634 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
1635 where
1636 V: de::Visitor<'de>,
1637 {
1638 let value = if let ParserNumber::U64(len) = self.parse_integer(true)? {
1647 self.deserialize_str_by_len(visitor, len as usize)
1648 } else {
1649 Err(self.peek_invalid_type(&visitor))
1650 };
1651
1652 match value {
1665 Ok(value) => Ok(value),
1666 Err(err) => Err(self.fix_position(err)),
1667 }
1668 }
1669
1670 #[inline]
1671 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
1672 where
1673 V: de::Visitor<'de>,
1674 {
1675 self.deserialize_str(visitor)
1676 }
1677
1678 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
1731 where
1732 V: de::Visitor<'de>,
1733 {
1734 let value = if let ParserNumber::U64(len) = self.parse_integer(true)? {
1755 self.deserialize_bytes_by_len(visitor, len as usize)
1756 } else {
1757 Err(self.peek_invalid_type(&visitor))
1758 };
1759
1760 match value {
1761 Ok(value) => Ok(value),
1762 Err(err) => Err(self.fix_position(err)),
1763 }
1764 }
1765
1766 #[inline]
1767 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
1768 where
1769 V: de::Visitor<'de>,
1770 {
1771 self.deserialize_bytes(visitor)
1772 }
1773
1774 #[inline]
1776 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
1777 where
1778 V: de::Visitor<'de>,
1779 {
1780 match self.parse_whitespace()? {
1781 Some(b'n') => {
1782 self.eat_char();
1783 visitor.visit_none()
1785 }
1786 _ => visitor.visit_some(self),
1787 }
1788 }
1789
1790 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
1791 where
1792 V: de::Visitor<'de>,
1793 {
1794 let peek = match self.parse_whitespace()? {
1795 Some(b) => b,
1796 None => {
1797 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1798 }
1799 };
1800
1801 let value = match peek {
1802 b'n' => {
1803 self.eat_char();
1804 visitor.visit_unit()
1806 }
1807 _ => Err(self.peek_invalid_type(&visitor)),
1808 };
1809
1810 match value {
1811 Ok(value) => Ok(value),
1812 Err(err) => Err(self.fix_position(err)),
1813 }
1814 }
1815
1816 #[inline]
1817 fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
1818 where
1819 V: de::Visitor<'de>,
1820 {
1821 self.deserialize_unit(visitor)
1822 }
1823
1824 #[inline]
1826 fn deserialize_newtype_struct<V>(self, name: &str, visitor: V) -> Result<V::Value>
1827 where
1828 V: de::Visitor<'de>,
1829 {
1830 #[cfg(feature = "raw_value")]
1831 {
1832 if name == crate::raw::TOKEN {
1833 return self.deserialize_raw_value(visitor);
1834 }
1835 }
1836
1837 let _ = name;
1838 visitor.visit_newtype_struct(self)
1839 }
1840
1841 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
1842 where
1843 V: de::Visitor<'de>,
1844 {
1845 let peek = match self.parse_whitespace()? {
1846 Some(b) => b,
1847 None => {
1848 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1849 }
1850 };
1851
1852 let value = match peek {
1853 b'{' | b'[' => {
1854 check_recursion! {
1855 self.eat_char();
1856 let ret = visitor.visit_seq(SeqAccess::new(self));
1857 }
1858
1859 match (ret, self.end_seq()) {
1860 (Ok(ret), Ok(())) => Ok(ret),
1861 (Err(err), _) | (_, Err(err)) => Err(err),
1862 }
1863 }
1864 _ => Err(self.peek_invalid_type(&visitor)),
1865 };
1866
1867 match value {
1868 Ok(value) => Ok(value),
1869 Err(err) => Err(self.fix_position(err)),
1870 }
1871 }
1872
1873 #[inline]
1874 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
1875 where
1876 V: de::Visitor<'de>,
1877 {
1878 self.deserialize_seq(visitor)
1879 }
1880
1881 #[inline]
1882 fn deserialize_tuple_struct<V>(
1883 self,
1884 _name: &'static str,
1885 _len: usize,
1886 visitor: V,
1887 ) -> Result<V::Value>
1888 where
1889 V: de::Visitor<'de>,
1890 {
1891 self.deserialize_seq(visitor)
1892 }
1893
1894 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
1895 where
1896 V: de::Visitor<'de>,
1897 {
1898 let peek = match self.parse_whitespace()? {
1899 Some(b) => b,
1900 None => {
1901 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1902 }
1903 };
1904
1905 let value = match peek {
1906 b'{' => {
1907 check_recursion! {
1908 self.eat_char();
1909 let ret = visitor.visit_map(MapAccess::new(self));
1910 }
1911
1912 match (ret, self.end_map()) {
1913 (Ok(ret), Ok(())) => Ok(ret),
1914 (Err(err), _) | (_, Err(err)) => Err(err),
1915 }
1916 }
1917 _ => Err(self.peek_invalid_type(&visitor)),
1918 };
1919
1920 match value {
1921 Ok(value) => Ok(value),
1922 Err(err) => Err(self.fix_position(err)),
1923 }
1924 }
1925
1926 fn deserialize_struct<V>(
1927 self,
1928 _name: &'static str,
1929 _fields: &'static [&'static str],
1930 visitor: V,
1931 ) -> Result<V::Value>
1932 where
1933 V: de::Visitor<'de>,
1934 {
1935 let peek = match self.parse_whitespace()? {
1936 Some(b) => b,
1937 None => {
1938 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1939 }
1940 };
1941
1942 let value = match peek {
1943 b'{' => {
1955 check_recursion! {
1956 self.eat_char();
1957 let ret = visitor.visit_map(MapAccess::new(self));
1958 }
1959
1960 match (ret, self.end_map()) {
1961 (Ok(ret), Ok(())) => Ok(ret),
1962 (Err(err), _) | (_, Err(err)) => Err(err),
1963 }
1964 }
1965 _ => Err(self.peek_invalid_type(&visitor)),
1966 };
1967
1968 match value {
1969 Ok(value) => Ok(value),
1970 Err(err) => Err(self.fix_position(err)),
1971 }
1972 }
1973
1974 #[inline]
1977 fn deserialize_enum<V>(
1978 self,
1979 _name: &str,
1980 _variants: &'static [&'static str],
1981 visitor: V,
1982 ) -> Result<V::Value>
1983 where
1984 V: de::Visitor<'de>,
1985 {
1986 match self.parse_whitespace()? {
1987 Some(b'{') => {
1988 check_recursion! {
1989 self.eat_char();
1990 let value = visitor.visit_enum(VariantAccess::new(self))?;
1991 }
1992
1993 match self.parse_whitespace()? {
1994 Some(b'}') => {
1995 self.eat_char();
1996 Ok(value)
1997 }
1998 Some(_) => Err(self.error(ErrorCode::ExpectedSomeValue)),
1999 None => Err(self.error(ErrorCode::EofWhileParsingObject)),
2000 }
2001 }
2002 Some(_) => visitor.visit_enum(VariantAccess::new(self)), None => Err(self.peek_error(ErrorCode::EofWhileParsingValue)),
2006 }
2007 }
2008
2009 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
2010 where
2011 V: de::Visitor<'de>,
2012 {
2013 if self.parse_whitespace()?.is_none() {
2015 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
2016 };
2017
2018 let value = {
2019 match self.read.parse_str()? {
2021 Reference::Borrowed(s) => visitor.visit_borrowed_str(s),
2022 Reference::Copied(s) => visitor.visit_str(s),
2023 }
2024 };
2025
2026 match value {
2027 Ok(value) => Ok(value),
2028 Err(err) => Err(self.fix_position(err)),
2029 }
2030 }
2031
2032 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
2033 where
2034 V: de::Visitor<'de>,
2035 {
2036 self.ignore_value()?;
2037 visitor.visit_unit()
2038 }
2039}