1use crate::error::{Error, ErrorCode, Result};
4#[cfg(feature = "float_roundtrip")]
5use crate::lexical;
6use crate::number::Number;
7use crate::read::{self, Fused, Reference};
8use alloc::string::String;
9use alloc::vec::Vec;
10#[cfg(feature = "float_roundtrip")]
11use core::iter;
12use core::iter::FusedIterator;
13use core::marker::PhantomData;
14use core::result;
15use core::str::FromStr;
16use serde::de::{self, Expected, Unexpected};
17use serde::forward_to_deserialize_any;
18
19#[cfg(feature = "arbitrary_precision")]
20use crate::number::NumberDeserializer;
21
22pub use crate::read::{Read, SliceRead, StrRead};
23
24#[cfg(feature = "std")]
25#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
26pub use crate::read::IoRead;
27
28pub struct Deserializer<R> {
32 read: R,
33 scratch: Vec<u8>,
34 remaining_depth: u8,
35 #[cfg(feature = "float_roundtrip")]
36 single_precision: bool,
37 #[cfg(feature = "unbounded_depth")]
38 disable_recursion_limit: bool,
39}
40
41impl<'de, R> Deserializer<R>
42where
43 R: read::Read<'de>,
44{
45 pub fn new(read: R) -> Self {
54 Deserializer {
55 read,
56 scratch: Vec::new(),
57 remaining_depth: 128,
58 #[cfg(feature = "float_roundtrip")]
59 single_precision: false,
60 #[cfg(feature = "unbounded_depth")]
61 disable_recursion_limit: false,
62 }
63 }
64}
65
66#[cfg(feature = "std")]
67impl<R> Deserializer<read::IoRead<R>>
68where
69 R: crate::io::Read,
70{
71 pub fn from_reader(reader: R) -> Self {
77 Deserializer::new(read::IoRead::new(reader))
78 }
79}
80
81impl<'a> Deserializer<read::SliceRead<'a>> {
82 pub fn from_slice(bytes: &'a [u8]) -> Self {
84 Deserializer::new(read::SliceRead::new(bytes))
85 }
86}
87
88impl<'a> Deserializer<read::StrRead<'a>> {
89 pub fn from_str(s: &'a str) -> Self {
91 Deserializer::new(read::StrRead::new(s))
92 }
93}
94
95macro_rules! overflow {
96 ($a:ident * 10 + $b:ident, $c:expr) => {
97 match $c {
98 c => $a >= c / 10 && ($a > c / 10 || $b > c % 10),
99 }
100 };
101}
102
103pub(crate) enum ParserNumber {
104 F64(f64),
105 U64(u64),
106 I64(i64),
107 #[cfg(feature = "arbitrary_precision")]
108 String(String),
109}
110
111impl ParserNumber {
112 fn visit<'de, V>(self, visitor: V) -> Result<V::Value>
113 where
114 V: de::Visitor<'de>,
115 {
116 match self {
117 ParserNumber::F64(x) => visitor.visit_f64(x),
118 ParserNumber::U64(x) => visitor.visit_u64(x),
119 ParserNumber::I64(x) => visitor.visit_i64(x),
120 #[cfg(feature = "arbitrary_precision")]
121 ParserNumber::String(x) => visitor.visit_map(NumberDeserializer { number: x.into() }),
122 }
123 }
124
125 fn invalid_type(self, exp: &dyn Expected) -> Error {
126 match self {
127 ParserNumber::F64(x) => de::Error::invalid_type(Unexpected::Float(x), exp),
128 ParserNumber::U64(x) => de::Error::invalid_type(Unexpected::Unsigned(x), exp),
129 ParserNumber::I64(x) => de::Error::invalid_type(Unexpected::Signed(x), exp),
130 #[cfg(feature = "arbitrary_precision")]
131 ParserNumber::String(_) => de::Error::invalid_type(Unexpected::Other("number"), exp),
132 }
133 }
134}
135
136impl<'de, R: Read<'de>> Deserializer<R> {
137 pub fn end(&mut self) -> Result<()> {
141 match tri!(self.parse_whitespace()) {
142 Some(_) => Err(self.peek_error(ErrorCode::TrailingCharacters)),
143 None => Ok(()),
144 }
145 }
146
147 pub fn into_iter<T>(self) -> StreamDeserializer<'de, R, T>
149 where
150 T: de::Deserialize<'de>,
151 {
152 let offset = self.read.byte_offset();
155 StreamDeserializer {
156 de: self,
157 offset,
158 failed: false,
159 output: PhantomData,
160 lifetime: PhantomData,
161 }
162 }
163
164 #[cfg(feature = "unbounded_depth")]
208 #[cfg_attr(docsrs, doc(cfg(feature = "unbounded_depth")))]
209 pub fn disable_recursion_limit(&mut self) {
210 self.disable_recursion_limit = true;
211 }
212
213 pub(crate) fn peek(&mut self) -> Result<Option<u8>> {
214 self.read.peek()
215 }
216
217 fn peek_or_null(&mut self) -> Result<u8> {
218 Ok(tri!(self.peek()).unwrap_or(b'\x00'))
219 }
220
221 fn eat_char(&mut self) {
222 self.read.discard();
223 }
224
225 fn next_char(&mut self) -> Result<Option<u8>> {
226 self.read.next()
227 }
228
229 fn next_char_or_null(&mut self) -> Result<u8> {
230 Ok(tri!(self.next_char()).unwrap_or(b'\x00'))
231 }
232
233 #[cold]
235 fn error(&self, reason: ErrorCode) -> Error {
236 let position = self.read.position();
237 Error::syntax(reason, position.line, position.column)
238 }
239
240 #[cold]
242 fn peek_error(&self, reason: ErrorCode) -> Error {
243 let position = self.read.peek_position();
244 Error::syntax(reason, position.line, position.column)
245 }
246
247 fn parse_whitespace(&mut self) -> Result<Option<u8>> {
250 loop {
251 match tri!(self.peek()) {
252 Some(b' ' | b'\n' | b'\t' | b'\r') => {
253 self.eat_char();
254 }
255 other => {
256 return Ok(other);
257 }
258 }
259 }
260 }
261
262 #[cold]
263 fn peek_invalid_type(&mut self, exp: &dyn Expected) -> Error {
264 let err = match self.peek_or_null().unwrap_or(b'\x00') {
265 b'n' => {
266 self.eat_char();
267 if let Err(err) = self.parse_ident(b"ull") {
268 return err;
269 }
270 de::Error::invalid_type(Unexpected::Unit, exp)
271 }
272 b't' => {
273 self.eat_char();
274 if let Err(err) = self.parse_ident(b"rue") {
275 return err;
276 }
277 de::Error::invalid_type(Unexpected::Bool(true), exp)
278 }
279 b'f' => {
280 self.eat_char();
281 if let Err(err) = self.parse_ident(b"alse") {
282 return err;
283 }
284 de::Error::invalid_type(Unexpected::Bool(false), exp)
285 }
286 b'-' => {
287 self.eat_char();
288 match self.parse_any_number(false) {
289 Ok(n) => n.invalid_type(exp),
290 Err(err) => return err,
291 }
292 }
293 b'0'..=b'9' => match self.parse_any_number(true) {
294 Ok(n) => n.invalid_type(exp),
295 Err(err) => return err,
296 },
297 b'"' => {
298 self.eat_char();
299 self.scratch.clear();
300 match self.read.parse_str(&mut self.scratch) {
301 Ok(s) => de::Error::invalid_type(Unexpected::Str(&s), exp),
302 Err(err) => return err,
303 }
304 }
305 b'[' => de::Error::invalid_type(Unexpected::Seq, exp),
306 b'{' => de::Error::invalid_type(Unexpected::Map, exp),
307 _ => self.peek_error(ErrorCode::ExpectedSomeValue),
308 };
309
310 self.fix_position(err)
311 }
312
313 pub(crate) fn deserialize_number<'any, V>(&mut self, visitor: V) -> Result<V::Value>
314 where
315 V: de::Visitor<'any>,
316 {
317 let peek = match tri!(self.parse_whitespace()) {
318 Some(b) => b,
319 None => {
320 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
321 }
322 };
323
324 let value = match peek {
325 b'-' => {
326 self.eat_char();
327 tri!(self.parse_integer(false)).visit(visitor)
328 }
329 b'0'..=b'9' => tri!(self.parse_integer(true)).visit(visitor),
330 _ => Err(self.peek_invalid_type(&visitor)),
331 };
332
333 match value {
334 Ok(value) => Ok(value),
335 Err(err) => Err(self.fix_position(err)),
336 }
337 }
338
339 #[cfg(feature = "float_roundtrip")]
340 pub(crate) fn do_deserialize_f32<'any, V>(&mut self, visitor: V) -> Result<V::Value>
341 where
342 V: de::Visitor<'any>,
343 {
344 self.single_precision = true;
345 let val = self.deserialize_number(visitor);
346 self.single_precision = false;
347 val
348 }
349
350 pub(crate) fn do_deserialize_i128<'any, V>(&mut self, visitor: V) -> Result<V::Value>
351 where
352 V: de::Visitor<'any>,
353 {
354 let mut buf = String::new();
355
356 match tri!(self.parse_whitespace()) {
357 Some(b'-') => {
358 self.eat_char();
359 buf.push('-');
360 }
361 Some(_) => {}
362 None => {
363 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
364 }
365 };
366
367 tri!(self.scan_integer128(&mut buf));
368
369 let value = match buf.parse() {
370 Ok(int) => visitor.visit_i128(int),
371 Err(_) => {
372 return Err(self.error(ErrorCode::NumberOutOfRange));
373 }
374 };
375
376 match value {
377 Ok(value) => Ok(value),
378 Err(err) => Err(self.fix_position(err)),
379 }
380 }
381
382 pub(crate) fn do_deserialize_u128<'any, V>(&mut self, visitor: V) -> Result<V::Value>
383 where
384 V: de::Visitor<'any>,
385 {
386 match tri!(self.parse_whitespace()) {
387 Some(b'-') => {
388 return Err(self.peek_error(ErrorCode::NumberOutOfRange));
389 }
390 Some(_) => {}
391 None => {
392 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
393 }
394 }
395
396 let mut buf = String::new();
397 tri!(self.scan_integer128(&mut buf));
398
399 let value = match buf.parse() {
400 Ok(int) => visitor.visit_u128(int),
401 Err(_) => {
402 return Err(self.error(ErrorCode::NumberOutOfRange));
403 }
404 };
405
406 match value {
407 Ok(value) => Ok(value),
408 Err(err) => Err(self.fix_position(err)),
409 }
410 }
411
412 fn scan_integer128(&mut self, buf: &mut String) -> Result<()> {
413 match tri!(self.next_char_or_null()) {
414 b'0' => {
415 buf.push('0');
416 match tri!(self.peek_or_null()) {
418 b'0'..=b'9' => Err(self.peek_error(ErrorCode::InvalidNumber)),
419 _ => Ok(()),
420 }
421 }
422 c @ b'1'..=b'9' => {
423 buf.push(c as char);
424 while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
425 self.eat_char();
426 buf.push(c as char);
427 }
428 Ok(())
429 }
430 _ => Err(self.error(ErrorCode::InvalidNumber)),
431 }
432 }
433
434 #[cold]
435 fn fix_position(&self, err: Error) -> Error {
436 err.fix_position(move |code| self.error(code))
437 }
438
439 fn parse_ident(&mut self, ident: &[u8]) -> Result<()> {
440 for expected in ident {
441 match tri!(self.next_char()) {
442 None => {
443 return Err(self.error(ErrorCode::EofWhileParsingValue));
444 }
445 Some(next) => {
446 if next != *expected {
447 return Err(self.error(ErrorCode::ExpectedSomeIdent));
448 }
449 }
450 }
451 }
452
453 Ok(())
454 }
455
456 fn parse_integer(&mut self, positive: bool) -> Result<ParserNumber> {
457 let next = match tri!(self.next_char()) {
458 Some(b) => b,
459 None => {
460 return Err(self.error(ErrorCode::EofWhileParsingValue));
461 }
462 };
463
464 match next {
465 b'0' => {
466 match tri!(self.peek_or_null()) {
468 b'0'..=b'9' => Err(self.peek_error(ErrorCode::InvalidNumber)),
469 _ => self.parse_number(positive, 0),
470 }
471 }
472 c @ b'1'..=b'9' => {
473 let mut significand = (c - b'0') as u64;
474
475 loop {
476 match tri!(self.peek_or_null()) {
477 c @ b'0'..=b'9' => {
478 let digit = (c - b'0') as u64;
479
480 if overflow!(significand * 10 + digit, u64::max_value()) {
485 return Ok(ParserNumber::F64(tri!(
486 self.parse_long_integer(positive, significand),
487 )));
488 }
489
490 self.eat_char();
491 significand = significand * 10 + digit;
492 }
493 _ => {
494 return self.parse_number(positive, significand);
495 }
496 }
497 }
498 }
499 _ => Err(self.error(ErrorCode::InvalidNumber)),
500 }
501 }
502
503 fn parse_number(&mut self, positive: bool, significand: u64) -> Result<ParserNumber> {
504 Ok(match tri!(self.peek_or_null()) {
505 b'.' => ParserNumber::F64(tri!(self.parse_decimal(positive, significand, 0))),
506 b'e' | b'E' => ParserNumber::F64(tri!(self.parse_exponent(positive, significand, 0))),
507 _ => {
508 if positive {
509 ParserNumber::U64(significand)
510 } else {
511 let neg = (significand as i64).wrapping_neg();
512
513 if neg >= 0 {
515 ParserNumber::F64(-(significand as f64))
516 } else {
517 ParserNumber::I64(neg)
518 }
519 }
520 }
521 })
522 }
523
524 fn parse_decimal(
525 &mut self,
526 positive: bool,
527 mut significand: u64,
528 exponent_before_decimal_point: i32,
529 ) -> Result<f64> {
530 self.eat_char();
531
532 let mut exponent_after_decimal_point = 0;
533 while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
534 let digit = (c - b'0') as u64;
535
536 if overflow!(significand * 10 + digit, u64::max_value()) {
537 let exponent = exponent_before_decimal_point + exponent_after_decimal_point;
538 return self.parse_decimal_overflow(positive, significand, exponent);
539 }
540
541 self.eat_char();
542 significand = significand * 10 + digit;
543 exponent_after_decimal_point -= 1;
544 }
545
546 if exponent_after_decimal_point == 0 {
548 match tri!(self.peek()) {
549 Some(_) => return Err(self.peek_error(ErrorCode::InvalidNumber)),
550 None => return Err(self.peek_error(ErrorCode::EofWhileParsingValue)),
551 }
552 }
553
554 let exponent = exponent_before_decimal_point + exponent_after_decimal_point;
555 match tri!(self.peek_or_null()) {
556 b'e' | b'E' => self.parse_exponent(positive, significand, exponent),
557 _ => self.f64_from_parts(positive, significand, exponent),
558 }
559 }
560
561 fn parse_exponent(
562 &mut self,
563 positive: bool,
564 significand: u64,
565 starting_exp: i32,
566 ) -> Result<f64> {
567 self.eat_char();
568
569 let positive_exp = match tri!(self.peek_or_null()) {
570 b'+' => {
571 self.eat_char();
572 true
573 }
574 b'-' => {
575 self.eat_char();
576 false
577 }
578 _ => true,
579 };
580
581 let next = match tri!(self.next_char()) {
582 Some(b) => b,
583 None => {
584 return Err(self.error(ErrorCode::EofWhileParsingValue));
585 }
586 };
587
588 let mut exp = match next {
590 c @ b'0'..=b'9' => (c - b'0') as i32,
591 _ => {
592 return Err(self.error(ErrorCode::InvalidNumber));
593 }
594 };
595
596 while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
597 self.eat_char();
598 let digit = (c - b'0') as i32;
599
600 if overflow!(exp * 10 + digit, i32::max_value()) {
601 let zero_significand = significand == 0;
602 return self.parse_exponent_overflow(positive, zero_significand, positive_exp);
603 }
604
605 exp = exp * 10 + digit;
606 }
607
608 let final_exp = if positive_exp {
609 starting_exp.saturating_add(exp)
610 } else {
611 starting_exp.saturating_sub(exp)
612 };
613
614 self.f64_from_parts(positive, significand, final_exp)
615 }
616
617 #[cfg(feature = "float_roundtrip")]
618 fn f64_from_parts(&mut self, positive: bool, significand: u64, exponent: i32) -> Result<f64> {
619 let f = if self.single_precision {
620 lexical::parse_concise_float::<f32>(significand, exponent) as f64
621 } else {
622 lexical::parse_concise_float::<f64>(significand, exponent)
623 };
624
625 if f.is_infinite() {
626 Err(self.error(ErrorCode::NumberOutOfRange))
627 } else {
628 Ok(if positive { f } else { -f })
629 }
630 }
631
632 #[cfg(not(feature = "float_roundtrip"))]
633 fn f64_from_parts(
634 &mut self,
635 positive: bool,
636 significand: u64,
637 mut exponent: i32,
638 ) -> Result<f64> {
639 let mut f = significand as f64;
640 loop {
641 match POW10.get(exponent.wrapping_abs() as usize) {
642 Some(&pow) => {
643 if exponent >= 0 {
644 f *= pow;
645 if f.is_infinite() {
646 return Err(self.error(ErrorCode::NumberOutOfRange));
647 }
648 } else {
649 f /= pow;
650 }
651 break;
652 }
653 None => {
654 if f == 0.0 {
655 break;
656 }
657 if exponent >= 0 {
658 return Err(self.error(ErrorCode::NumberOutOfRange));
659 }
660 f /= 1e308;
661 exponent += 308;
662 }
663 }
664 }
665 Ok(if positive { f } else { -f })
666 }
667
668 #[cfg(feature = "float_roundtrip")]
669 #[cold]
670 #[inline(never)]
671 fn parse_long_integer(&mut self, positive: bool, partial_significand: u64) -> Result<f64> {
672 self.scratch.clear();
685 self.scratch
686 .extend_from_slice(itoa::Buffer::new().format(partial_significand).as_bytes());
687
688 loop {
689 match tri!(self.peek_or_null()) {
690 c @ b'0'..=b'9' => {
691 self.scratch.push(c);
692 self.eat_char();
693 }
694 b'.' => {
695 self.eat_char();
696 return self.parse_long_decimal(positive, self.scratch.len());
697 }
698 b'e' | b'E' => {
699 return self.parse_long_exponent(positive, self.scratch.len());
700 }
701 _ => {
702 return self.f64_long_from_parts(positive, self.scratch.len(), 0);
703 }
704 }
705 }
706 }
707
708 #[cfg(not(feature = "float_roundtrip"))]
709 #[cold]
710 #[inline(never)]
711 fn parse_long_integer(&mut self, positive: bool, significand: u64) -> Result<f64> {
712 let mut exponent = 0;
713 loop {
714 match tri!(self.peek_or_null()) {
715 b'0'..=b'9' => {
716 self.eat_char();
717 exponent += 1;
720 }
721 b'.' => {
722 return self.parse_decimal(positive, significand, exponent);
723 }
724 b'e' | b'E' => {
725 return self.parse_exponent(positive, significand, exponent);
726 }
727 _ => {
728 return self.f64_from_parts(positive, significand, exponent);
729 }
730 }
731 }
732 }
733
734 #[cfg(feature = "float_roundtrip")]
735 #[cold]
736 fn parse_long_decimal(&mut self, positive: bool, integer_end: usize) -> Result<f64> {
737 let mut at_least_one_digit = integer_end < self.scratch.len();
738 while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
739 self.scratch.push(c);
740 self.eat_char();
741 at_least_one_digit = true;
742 }
743
744 if !at_least_one_digit {
745 match tri!(self.peek()) {
746 Some(_) => return Err(self.peek_error(ErrorCode::InvalidNumber)),
747 None => return Err(self.peek_error(ErrorCode::EofWhileParsingValue)),
748 }
749 }
750
751 match tri!(self.peek_or_null()) {
752 b'e' | b'E' => self.parse_long_exponent(positive, integer_end),
753 _ => self.f64_long_from_parts(positive, integer_end, 0),
754 }
755 }
756
757 #[cfg(feature = "float_roundtrip")]
758 fn parse_long_exponent(&mut self, positive: bool, integer_end: usize) -> Result<f64> {
759 self.eat_char();
760
761 let positive_exp = match tri!(self.peek_or_null()) {
762 b'+' => {
763 self.eat_char();
764 true
765 }
766 b'-' => {
767 self.eat_char();
768 false
769 }
770 _ => true,
771 };
772
773 let next = match tri!(self.next_char()) {
774 Some(b) => b,
775 None => {
776 return Err(self.error(ErrorCode::EofWhileParsingValue));
777 }
778 };
779
780 let mut exp = match next {
782 c @ b'0'..=b'9' => (c - b'0') as i32,
783 _ => {
784 return Err(self.error(ErrorCode::InvalidNumber));
785 }
786 };
787
788 while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
789 self.eat_char();
790 let digit = (c - b'0') as i32;
791
792 if overflow!(exp * 10 + digit, i32::max_value()) {
793 let zero_significand = self.scratch.iter().all(|&digit| digit == b'0');
794 return self.parse_exponent_overflow(positive, zero_significand, positive_exp);
795 }
796
797 exp = exp * 10 + digit;
798 }
799
800 let final_exp = if positive_exp { exp } else { -exp };
801
802 self.f64_long_from_parts(positive, integer_end, final_exp)
803 }
804
805 #[cfg(feature = "float_roundtrip")]
808 #[cold]
809 #[inline(never)]
810 fn parse_decimal_overflow(
811 &mut self,
812 positive: bool,
813 significand: u64,
814 exponent: i32,
815 ) -> Result<f64> {
816 let mut buffer = itoa::Buffer::new();
817 let significand = buffer.format(significand);
818 let fraction_digits = -exponent as usize;
819 self.scratch.clear();
820 if let Some(zeros) = fraction_digits.checked_sub(significand.len() + 1) {
821 self.scratch.extend(iter::repeat(b'0').take(zeros + 1));
822 }
823 self.scratch.extend_from_slice(significand.as_bytes());
824 let integer_end = self.scratch.len() - fraction_digits;
825 self.parse_long_decimal(positive, integer_end)
826 }
827
828 #[cfg(not(feature = "float_roundtrip"))]
829 #[cold]
830 #[inline(never)]
831 fn parse_decimal_overflow(
832 &mut self,
833 positive: bool,
834 significand: u64,
835 exponent: i32,
836 ) -> Result<f64> {
837 while let b'0'..=b'9' = tri!(self.peek_or_null()) {
840 self.eat_char();
841 }
842
843 match tri!(self.peek_or_null()) {
844 b'e' | b'E' => self.parse_exponent(positive, significand, exponent),
845 _ => self.f64_from_parts(positive, significand, exponent),
846 }
847 }
848
849 #[cold]
852 #[inline(never)]
853 fn parse_exponent_overflow(
854 &mut self,
855 positive: bool,
856 zero_significand: bool,
857 positive_exp: bool,
858 ) -> Result<f64> {
859 if !zero_significand && positive_exp {
861 return Err(self.error(ErrorCode::NumberOutOfRange));
862 }
863
864 while let b'0'..=b'9' = tri!(self.peek_or_null()) {
865 self.eat_char();
866 }
867 Ok(if positive { 0.0 } else { -0.0 })
868 }
869
870 #[cfg(feature = "float_roundtrip")]
871 fn f64_long_from_parts(
872 &mut self,
873 positive: bool,
874 integer_end: usize,
875 exponent: i32,
876 ) -> Result<f64> {
877 let integer = &self.scratch[..integer_end];
878 let fraction = &self.scratch[integer_end..];
879
880 let f = if self.single_precision {
881 lexical::parse_truncated_float::<f32>(integer, fraction, exponent) as f64
882 } else {
883 lexical::parse_truncated_float::<f64>(integer, fraction, exponent)
884 };
885
886 if f.is_infinite() {
887 Err(self.error(ErrorCode::NumberOutOfRange))
888 } else {
889 Ok(if positive { f } else { -f })
890 }
891 }
892
893 fn parse_any_signed_number(&mut self) -> Result<ParserNumber> {
894 let peek = match tri!(self.peek()) {
895 Some(b) => b,
896 None => {
897 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
898 }
899 };
900
901 let value = match peek {
902 b'-' => {
903 self.eat_char();
904 self.parse_any_number(false)
905 }
906 b'0'..=b'9' => self.parse_any_number(true),
907 _ => Err(self.peek_error(ErrorCode::InvalidNumber)),
908 };
909
910 let value = match tri!(self.peek()) {
911 Some(_) => Err(self.peek_error(ErrorCode::InvalidNumber)),
912 None => value,
913 };
914
915 match value {
916 Ok(value) => Ok(value),
917 Err(err) => Err(self.fix_position(err)),
923 }
924 }
925
926 #[cfg(not(feature = "arbitrary_precision"))]
927 fn parse_any_number(&mut self, positive: bool) -> Result<ParserNumber> {
928 self.parse_integer(positive)
929 }
930
931 #[cfg(feature = "arbitrary_precision")]
932 fn parse_any_number(&mut self, positive: bool) -> Result<ParserNumber> {
933 let mut buf = String::with_capacity(16);
934 if !positive {
935 buf.push('-');
936 }
937 tri!(self.scan_integer(&mut buf));
938 if positive {
939 if let Ok(unsigned) = buf.parse() {
940 return Ok(ParserNumber::U64(unsigned));
941 }
942 } else {
943 if let Ok(signed) = buf.parse() {
944 return Ok(ParserNumber::I64(signed));
945 }
946 }
947 Ok(ParserNumber::String(buf))
948 }
949
950 #[cfg(feature = "arbitrary_precision")]
951 fn scan_or_eof(&mut self, buf: &mut String) -> Result<u8> {
952 match tri!(self.next_char()) {
953 Some(b) => {
954 buf.push(b as char);
955 Ok(b)
956 }
957 None => Err(self.error(ErrorCode::EofWhileParsingValue)),
958 }
959 }
960
961 #[cfg(feature = "arbitrary_precision")]
962 fn scan_integer(&mut self, buf: &mut String) -> Result<()> {
963 match tri!(self.scan_or_eof(buf)) {
964 b'0' => {
965 match tri!(self.peek_or_null()) {
967 b'0'..=b'9' => Err(self.peek_error(ErrorCode::InvalidNumber)),
968 _ => self.scan_number(buf),
969 }
970 }
971 b'1'..=b'9' => loop {
972 match tri!(self.peek_or_null()) {
973 c @ b'0'..=b'9' => {
974 self.eat_char();
975 buf.push(c as char);
976 }
977 _ => {
978 return self.scan_number(buf);
979 }
980 }
981 },
982 _ => Err(self.error(ErrorCode::InvalidNumber)),
983 }
984 }
985
986 #[cfg(feature = "arbitrary_precision")]
987 fn scan_number(&mut self, buf: &mut String) -> Result<()> {
988 match tri!(self.peek_or_null()) {
989 b'.' => self.scan_decimal(buf),
990 e @ (b'e' | b'E') => self.scan_exponent(e as char, buf),
991 _ => Ok(()),
992 }
993 }
994
995 #[cfg(feature = "arbitrary_precision")]
996 fn scan_decimal(&mut self, buf: &mut String) -> Result<()> {
997 self.eat_char();
998 buf.push('.');
999
1000 let mut at_least_one_digit = false;
1001 while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
1002 self.eat_char();
1003 buf.push(c as char);
1004 at_least_one_digit = true;
1005 }
1006
1007 if !at_least_one_digit {
1008 match tri!(self.peek()) {
1009 Some(_) => return Err(self.peek_error(ErrorCode::InvalidNumber)),
1010 None => return Err(self.peek_error(ErrorCode::EofWhileParsingValue)),
1011 }
1012 }
1013
1014 match tri!(self.peek_or_null()) {
1015 e @ (b'e' | b'E') => self.scan_exponent(e as char, buf),
1016 _ => Ok(()),
1017 }
1018 }
1019
1020 #[cfg(feature = "arbitrary_precision")]
1021 fn scan_exponent(&mut self, e: char, buf: &mut String) -> Result<()> {
1022 self.eat_char();
1023 buf.push(e);
1024
1025 match tri!(self.peek_or_null()) {
1026 b'+' => {
1027 self.eat_char();
1028 buf.push('+');
1029 }
1030 b'-' => {
1031 self.eat_char();
1032 buf.push('-');
1033 }
1034 _ => {}
1035 }
1036
1037 match tri!(self.scan_or_eof(buf)) {
1039 b'0'..=b'9' => {}
1040 _ => {
1041 return Err(self.error(ErrorCode::InvalidNumber));
1042 }
1043 }
1044
1045 while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
1046 self.eat_char();
1047 buf.push(c as char);
1048 }
1049
1050 Ok(())
1051 }
1052
1053 fn parse_object_colon(&mut self) -> Result<()> {
1054 match tri!(self.parse_whitespace()) {
1055 Some(b':') => {
1056 self.eat_char();
1057 Ok(())
1058 }
1059 Some(_) => Err(self.peek_error(ErrorCode::ExpectedColon)),
1060 None => Err(self.peek_error(ErrorCode::EofWhileParsingObject)),
1061 }
1062 }
1063
1064 fn end_seq(&mut self) -> Result<()> {
1065 match tri!(self.parse_whitespace()) {
1066 Some(b']') => {
1067 self.eat_char();
1068 Ok(())
1069 }
1070 Some(b',') => {
1071 self.eat_char();
1072 match self.parse_whitespace() {
1073 Ok(Some(b']')) => Err(self.peek_error(ErrorCode::TrailingComma)),
1074 _ => Err(self.peek_error(ErrorCode::TrailingCharacters)),
1075 }
1076 }
1077 Some(_) => Err(self.peek_error(ErrorCode::TrailingCharacters)),
1078 None => Err(self.peek_error(ErrorCode::EofWhileParsingList)),
1079 }
1080 }
1081
1082 fn end_map(&mut self) -> Result<()> {
1083 match tri!(self.parse_whitespace()) {
1084 Some(b'}') => {
1085 self.eat_char();
1086 Ok(())
1087 }
1088 Some(b',') => Err(self.peek_error(ErrorCode::TrailingComma)),
1089 Some(_) => Err(self.peek_error(ErrorCode::TrailingCharacters)),
1090 None => Err(self.peek_error(ErrorCode::EofWhileParsingObject)),
1091 }
1092 }
1093
1094 fn ignore_value(&mut self) -> Result<()> {
1095 self.scratch.clear();
1096 let mut enclosing = None;
1097
1098 loop {
1099 let peek = match tri!(self.parse_whitespace()) {
1100 Some(b) => b,
1101 None => {
1102 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1103 }
1104 };
1105
1106 let frame = match peek {
1107 b'n' => {
1108 self.eat_char();
1109 tri!(self.parse_ident(b"ull"));
1110 None
1111 }
1112 b't' => {
1113 self.eat_char();
1114 tri!(self.parse_ident(b"rue"));
1115 None
1116 }
1117 b'f' => {
1118 self.eat_char();
1119 tri!(self.parse_ident(b"alse"));
1120 None
1121 }
1122 b'-' => {
1123 self.eat_char();
1124 tri!(self.ignore_integer());
1125 None
1126 }
1127 b'0'..=b'9' => {
1128 tri!(self.ignore_integer());
1129 None
1130 }
1131 b'"' => {
1132 self.eat_char();
1133 tri!(self.read.ignore_str());
1134 None
1135 }
1136 frame @ (b'[' | b'{') => {
1137 self.scratch.extend(enclosing.take());
1138 self.eat_char();
1139 Some(frame)
1140 }
1141 _ => return Err(self.peek_error(ErrorCode::ExpectedSomeValue)),
1142 };
1143
1144 let (mut accept_comma, mut frame) = match frame {
1145 Some(frame) => (false, frame),
1146 None => match enclosing.take() {
1147 Some(frame) => (true, frame),
1148 None => match self.scratch.pop() {
1149 Some(frame) => (true, frame),
1150 None => return Ok(()),
1151 },
1152 },
1153 };
1154
1155 loop {
1156 match tri!(self.parse_whitespace()) {
1157 Some(b',') if accept_comma => {
1158 self.eat_char();
1159 break;
1160 }
1161 Some(b']') if frame == b'[' => {}
1162 Some(b'}') if frame == b'{' => {}
1163 Some(_) => {
1164 if accept_comma {
1165 return Err(self.peek_error(match frame {
1166 b'[' => ErrorCode::ExpectedListCommaOrEnd,
1167 b'{' => ErrorCode::ExpectedObjectCommaOrEnd,
1168 _ => unreachable!(),
1169 }));
1170 } else {
1171 break;
1172 }
1173 }
1174 None => {
1175 return Err(self.peek_error(match frame {
1176 b'[' => ErrorCode::EofWhileParsingList,
1177 b'{' => ErrorCode::EofWhileParsingObject,
1178 _ => unreachable!(),
1179 }));
1180 }
1181 }
1182
1183 self.eat_char();
1184 frame = match self.scratch.pop() {
1185 Some(frame) => frame,
1186 None => return Ok(()),
1187 };
1188 accept_comma = true;
1189 }
1190
1191 if frame == b'{' {
1192 match tri!(self.parse_whitespace()) {
1193 Some(b'"') => self.eat_char(),
1194 Some(_) => return Err(self.peek_error(ErrorCode::KeyMustBeAString)),
1195 None => return Err(self.peek_error(ErrorCode::EofWhileParsingObject)),
1196 }
1197 tri!(self.read.ignore_str());
1198 match tri!(self.parse_whitespace()) {
1199 Some(b':') => self.eat_char(),
1200 Some(_) => return Err(self.peek_error(ErrorCode::ExpectedColon)),
1201 None => return Err(self.peek_error(ErrorCode::EofWhileParsingObject)),
1202 }
1203 }
1204
1205 enclosing = Some(frame);
1206 }
1207 }
1208
1209 fn ignore_integer(&mut self) -> Result<()> {
1210 match tri!(self.next_char_or_null()) {
1211 b'0' => {
1212 if let b'0'..=b'9' = tri!(self.peek_or_null()) {
1214 return Err(self.peek_error(ErrorCode::InvalidNumber));
1215 }
1216 }
1217 b'1'..=b'9' => {
1218 while let b'0'..=b'9' = tri!(self.peek_or_null()) {
1219 self.eat_char();
1220 }
1221 }
1222 _ => {
1223 return Err(self.error(ErrorCode::InvalidNumber));
1224 }
1225 }
1226
1227 match tri!(self.peek_or_null()) {
1228 b'.' => self.ignore_decimal(),
1229 b'e' | b'E' => self.ignore_exponent(),
1230 _ => Ok(()),
1231 }
1232 }
1233
1234 fn ignore_decimal(&mut self) -> Result<()> {
1235 self.eat_char();
1236
1237 let mut at_least_one_digit = false;
1238 while let b'0'..=b'9' = tri!(self.peek_or_null()) {
1239 self.eat_char();
1240 at_least_one_digit = true;
1241 }
1242
1243 if !at_least_one_digit {
1244 return Err(self.peek_error(ErrorCode::InvalidNumber));
1245 }
1246
1247 match tri!(self.peek_or_null()) {
1248 b'e' | b'E' => self.ignore_exponent(),
1249 _ => Ok(()),
1250 }
1251 }
1252
1253 fn ignore_exponent(&mut self) -> Result<()> {
1254 self.eat_char();
1255
1256 match tri!(self.peek_or_null()) {
1257 b'+' | b'-' => self.eat_char(),
1258 _ => {}
1259 }
1260
1261 match tri!(self.next_char_or_null()) {
1263 b'0'..=b'9' => {}
1264 _ => {
1265 return Err(self.error(ErrorCode::InvalidNumber));
1266 }
1267 }
1268
1269 while let b'0'..=b'9' = tri!(self.peek_or_null()) {
1270 self.eat_char();
1271 }
1272
1273 Ok(())
1274 }
1275
1276 #[cfg(feature = "raw_value")]
1277 fn deserialize_raw_value<V>(&mut self, visitor: V) -> Result<V::Value>
1278 where
1279 V: de::Visitor<'de>,
1280 {
1281 tri!(self.parse_whitespace());
1282 self.read.begin_raw_buffering();
1283 tri!(self.ignore_value());
1284 self.read.end_raw_buffering(visitor)
1285 }
1286}
1287
1288impl FromStr for Number {
1289 type Err = Error;
1290
1291 fn from_str(s: &str) -> result::Result<Self, Self::Err> {
1292 Deserializer::from_str(s)
1293 .parse_any_signed_number()
1294 .map(Into::into)
1295 }
1296}
1297
1298#[cfg(not(feature = "float_roundtrip"))]
1299static POW10: [f64; 309] = [
1300 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,
1331];
1332
1333macro_rules! deserialize_number {
1334 ($method:ident) => {
1335 deserialize_number!($method, deserialize_number);
1336 };
1337
1338 ($method:ident, $using:ident) => {
1339 fn $method<V>(self, visitor: V) -> Result<V::Value>
1340 where
1341 V: de::Visitor<'de>,
1342 {
1343 self.$using(visitor)
1344 }
1345 };
1346}
1347
1348#[cfg(not(feature = "unbounded_depth"))]
1349macro_rules! if_checking_recursion_limit {
1350 ($($body:tt)*) => {
1351 $($body)*
1352 };
1353}
1354
1355#[cfg(feature = "unbounded_depth")]
1356macro_rules! if_checking_recursion_limit {
1357 ($this:ident $($body:tt)*) => {
1358 if !$this.disable_recursion_limit {
1359 $this $($body)*
1360 }
1361 };
1362}
1363
1364macro_rules! check_recursion {
1365 ($this:ident $($body:tt)*) => {
1366 if_checking_recursion_limit! {
1367 $this.remaining_depth -= 1;
1368 if $this.remaining_depth == 0 {
1369 return Err($this.peek_error(ErrorCode::RecursionLimitExceeded));
1370 }
1371 }
1372
1373 $this $($body)*
1374
1375 if_checking_recursion_limit! {
1376 $this.remaining_depth += 1;
1377 }
1378 };
1379}
1380
1381impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1382 type Error = Error;
1383
1384 #[inline]
1385 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
1386 where
1387 V: de::Visitor<'de>,
1388 {
1389 let peek = match tri!(self.parse_whitespace()) {
1390 Some(b) => b,
1391 None => {
1392 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1393 }
1394 };
1395
1396 let value = match peek {
1397 b'n' => {
1398 self.eat_char();
1399 tri!(self.parse_ident(b"ull"));
1400 visitor.visit_unit()
1401 }
1402 b't' => {
1403 self.eat_char();
1404 tri!(self.parse_ident(b"rue"));
1405 visitor.visit_bool(true)
1406 }
1407 b'f' => {
1408 self.eat_char();
1409 tri!(self.parse_ident(b"alse"));
1410 visitor.visit_bool(false)
1411 }
1412 b'-' => {
1413 self.eat_char();
1414 tri!(self.parse_any_number(false)).visit(visitor)
1415 }
1416 b'0'..=b'9' => tri!(self.parse_any_number(true)).visit(visitor),
1417 b'"' => {
1418 self.eat_char();
1419 self.scratch.clear();
1420 match tri!(self.read.parse_str(&mut self.scratch)) {
1421 Reference::Borrowed(s) => visitor.visit_borrowed_str(s),
1422 Reference::Copied(s) => visitor.visit_str(s),
1423 }
1424 }
1425 b'[' => {
1426 check_recursion! {
1427 self.eat_char();
1428 let ret = visitor.visit_seq(SeqAccess::new(self));
1429 }
1430
1431 match (ret, self.end_seq()) {
1432 (Ok(ret), Ok(())) => Ok(ret),
1433 (Err(err), _) | (_, Err(err)) => Err(err),
1434 }
1435 }
1436 b'{' => {
1437 check_recursion! {
1438 self.eat_char();
1439 let ret = visitor.visit_map(MapAccess::new(self));
1440 }
1441
1442 match (ret, self.end_map()) {
1443 (Ok(ret), Ok(())) => Ok(ret),
1444 (Err(err), _) | (_, Err(err)) => Err(err),
1445 }
1446 }
1447 _ => Err(self.peek_error(ErrorCode::ExpectedSomeValue)),
1448 };
1449
1450 match value {
1451 Ok(value) => Ok(value),
1452 Err(err) => Err(self.fix_position(err)),
1458 }
1459 }
1460
1461 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
1462 where
1463 V: de::Visitor<'de>,
1464 {
1465 let peek = match tri!(self.parse_whitespace()) {
1466 Some(b) => b,
1467 None => {
1468 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1469 }
1470 };
1471
1472 let value = match peek {
1473 b't' => {
1474 self.eat_char();
1475 tri!(self.parse_ident(b"rue"));
1476 visitor.visit_bool(true)
1477 }
1478 b'f' => {
1479 self.eat_char();
1480 tri!(self.parse_ident(b"alse"));
1481 visitor.visit_bool(false)
1482 }
1483 _ => Err(self.peek_invalid_type(&visitor)),
1484 };
1485
1486 match value {
1487 Ok(value) => Ok(value),
1488 Err(err) => Err(self.fix_position(err)),
1489 }
1490 }
1491
1492 deserialize_number!(deserialize_i8);
1493 deserialize_number!(deserialize_i16);
1494 deserialize_number!(deserialize_i32);
1495 deserialize_number!(deserialize_i64);
1496 deserialize_number!(deserialize_u8);
1497 deserialize_number!(deserialize_u16);
1498 deserialize_number!(deserialize_u32);
1499 deserialize_number!(deserialize_u64);
1500 #[cfg(not(feature = "float_roundtrip"))]
1501 deserialize_number!(deserialize_f32);
1502 deserialize_number!(deserialize_f64);
1503
1504 #[cfg(feature = "float_roundtrip")]
1505 deserialize_number!(deserialize_f32, do_deserialize_f32);
1506 deserialize_number!(deserialize_i128, do_deserialize_i128);
1507 deserialize_number!(deserialize_u128, do_deserialize_u128);
1508
1509 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
1510 where
1511 V: de::Visitor<'de>,
1512 {
1513 self.deserialize_str(visitor)
1514 }
1515
1516 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
1517 where
1518 V: de::Visitor<'de>,
1519 {
1520 let peek = match tri!(self.parse_whitespace()) {
1521 Some(b) => b,
1522 None => {
1523 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1524 }
1525 };
1526
1527 let value = match peek {
1528 b'"' => {
1529 self.eat_char();
1530 self.scratch.clear();
1531 match tri!(self.read.parse_str(&mut self.scratch)) {
1532 Reference::Borrowed(s) => visitor.visit_borrowed_str(s),
1533 Reference::Copied(s) => visitor.visit_str(s),
1534 }
1535 }
1536 _ => Err(self.peek_invalid_type(&visitor)),
1537 };
1538
1539 match value {
1540 Ok(value) => Ok(value),
1541 Err(err) => Err(self.fix_position(err)),
1542 }
1543 }
1544
1545 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
1546 where
1547 V: de::Visitor<'de>,
1548 {
1549 self.deserialize_str(visitor)
1550 }
1551
1552 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
1623 where
1624 V: de::Visitor<'de>,
1625 {
1626 let peek = match tri!(self.parse_whitespace()) {
1627 Some(b) => b,
1628 None => {
1629 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1630 }
1631 };
1632
1633 let value = match peek {
1634 b'"' => {
1635 self.eat_char();
1636 self.scratch.clear();
1637 match tri!(self.read.parse_str_raw(&mut self.scratch)) {
1638 Reference::Borrowed(b) => visitor.visit_borrowed_bytes(b),
1639 Reference::Copied(b) => visitor.visit_bytes(b),
1640 }
1641 }
1642 b'[' => self.deserialize_seq(visitor),
1643 _ => Err(self.peek_invalid_type(&visitor)),
1644 };
1645
1646 match value {
1647 Ok(value) => Ok(value),
1648 Err(err) => Err(self.fix_position(err)),
1649 }
1650 }
1651
1652 #[inline]
1653 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
1654 where
1655 V: de::Visitor<'de>,
1656 {
1657 self.deserialize_bytes(visitor)
1658 }
1659
1660 #[inline]
1662 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
1663 where
1664 V: de::Visitor<'de>,
1665 {
1666 match tri!(self.parse_whitespace()) {
1667 Some(b'n') => {
1668 self.eat_char();
1669 tri!(self.parse_ident(b"ull"));
1670 visitor.visit_none()
1671 }
1672 _ => visitor.visit_some(self),
1673 }
1674 }
1675
1676 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
1677 where
1678 V: de::Visitor<'de>,
1679 {
1680 let peek = match tri!(self.parse_whitespace()) {
1681 Some(b) => b,
1682 None => {
1683 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1684 }
1685 };
1686
1687 let value = match peek {
1688 b'n' => {
1689 self.eat_char();
1690 tri!(self.parse_ident(b"ull"));
1691 visitor.visit_unit()
1692 }
1693 _ => Err(self.peek_invalid_type(&visitor)),
1694 };
1695
1696 match value {
1697 Ok(value) => Ok(value),
1698 Err(err) => Err(self.fix_position(err)),
1699 }
1700 }
1701
1702 fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
1703 where
1704 V: de::Visitor<'de>,
1705 {
1706 self.deserialize_unit(visitor)
1707 }
1708
1709 #[inline]
1711 fn deserialize_newtype_struct<V>(self, name: &str, visitor: V) -> Result<V::Value>
1712 where
1713 V: de::Visitor<'de>,
1714 {
1715 #[cfg(feature = "raw_value")]
1716 {
1717 if name == crate::raw::TOKEN {
1718 return self.deserialize_raw_value(visitor);
1719 }
1720 }
1721
1722 let _ = name;
1723 visitor.visit_newtype_struct(self)
1724 }
1725
1726 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
1727 where
1728 V: de::Visitor<'de>,
1729 {
1730 let peek = match tri!(self.parse_whitespace()) {
1731 Some(b) => b,
1732 None => {
1733 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1734 }
1735 };
1736
1737 let value = match peek {
1738 b'[' => {
1739 check_recursion! {
1740 self.eat_char();
1741 let ret = visitor.visit_seq(SeqAccess::new(self));
1742 }
1743
1744 match (ret, self.end_seq()) {
1745 (Ok(ret), Ok(())) => Ok(ret),
1746 (Err(err), _) | (_, Err(err)) => Err(err),
1747 }
1748 }
1749 _ => Err(self.peek_invalid_type(&visitor)),
1750 };
1751
1752 match value {
1753 Ok(value) => Ok(value),
1754 Err(err) => Err(self.fix_position(err)),
1755 }
1756 }
1757
1758 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
1759 where
1760 V: de::Visitor<'de>,
1761 {
1762 self.deserialize_seq(visitor)
1763 }
1764
1765 fn deserialize_tuple_struct<V>(
1766 self,
1767 _name: &'static str,
1768 _len: usize,
1769 visitor: V,
1770 ) -> Result<V::Value>
1771 where
1772 V: de::Visitor<'de>,
1773 {
1774 self.deserialize_seq(visitor)
1775 }
1776
1777 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
1778 where
1779 V: de::Visitor<'de>,
1780 {
1781 let peek = match tri!(self.parse_whitespace()) {
1782 Some(b) => b,
1783 None => {
1784 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1785 }
1786 };
1787
1788 let value = match peek {
1789 b'{' => {
1790 check_recursion! {
1791 self.eat_char();
1792 let ret = visitor.visit_map(MapAccess::new(self));
1793 }
1794
1795 match (ret, self.end_map()) {
1796 (Ok(ret), Ok(())) => Ok(ret),
1797 (Err(err), _) | (_, Err(err)) => Err(err),
1798 }
1799 }
1800 _ => Err(self.peek_invalid_type(&visitor)),
1801 };
1802
1803 match value {
1804 Ok(value) => Ok(value),
1805 Err(err) => Err(self.fix_position(err)),
1806 }
1807 }
1808
1809 fn deserialize_struct<V>(
1810 self,
1811 _name: &'static str,
1812 _fields: &'static [&'static str],
1813 visitor: V,
1814 ) -> Result<V::Value>
1815 where
1816 V: de::Visitor<'de>,
1817 {
1818 let peek = match tri!(self.parse_whitespace()) {
1819 Some(b) => b,
1820 None => {
1821 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1822 }
1823 };
1824
1825 let value = match peek {
1826 b'[' => {
1827 check_recursion! {
1828 self.eat_char();
1829 let ret = visitor.visit_seq(SeqAccess::new(self));
1830 }
1831
1832 match (ret, self.end_seq()) {
1833 (Ok(ret), Ok(())) => Ok(ret),
1834 (Err(err), _) | (_, Err(err)) => Err(err),
1835 }
1836 }
1837 b'{' => {
1838 check_recursion! {
1839 self.eat_char();
1840 let ret = visitor.visit_map(MapAccess::new(self));
1841 }
1842
1843 match (ret, self.end_map()) {
1844 (Ok(ret), Ok(())) => Ok(ret),
1845 (Err(err), _) | (_, Err(err)) => Err(err),
1846 }
1847 }
1848 _ => Err(self.peek_invalid_type(&visitor)),
1849 };
1850
1851 match value {
1852 Ok(value) => Ok(value),
1853 Err(err) => Err(self.fix_position(err)),
1854 }
1855 }
1856
1857 #[inline]
1860 fn deserialize_enum<V>(
1861 self,
1862 _name: &str,
1863 _variants: &'static [&'static str],
1864 visitor: V,
1865 ) -> Result<V::Value>
1866 where
1867 V: de::Visitor<'de>,
1868 {
1869 match tri!(self.parse_whitespace()) {
1870 Some(b'{') => {
1871 check_recursion! {
1872 self.eat_char();
1873 let value = tri!(visitor.visit_enum(VariantAccess::new(self)));
1874 }
1875
1876 match tri!(self.parse_whitespace()) {
1877 Some(b'}') => {
1878 self.eat_char();
1879 Ok(value)
1880 }
1881 Some(_) => Err(self.error(ErrorCode::ExpectedSomeValue)),
1882 None => Err(self.error(ErrorCode::EofWhileParsingObject)),
1883 }
1884 }
1885 Some(b'"') => visitor.visit_enum(UnitVariantAccess::new(self)),
1886 Some(_) => Err(self.peek_error(ErrorCode::ExpectedSomeValue)),
1887 None => Err(self.peek_error(ErrorCode::EofWhileParsingValue)),
1888 }
1889 }
1890
1891 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
1892 where
1893 V: de::Visitor<'de>,
1894 {
1895 self.deserialize_str(visitor)
1896 }
1897
1898 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
1899 where
1900 V: de::Visitor<'de>,
1901 {
1902 tri!(self.ignore_value());
1903 visitor.visit_unit()
1904 }
1905}
1906
1907struct SeqAccess<'a, R: 'a> {
1908 de: &'a mut Deserializer<R>,
1909 first: bool,
1910}
1911
1912impl<'a, R: 'a> SeqAccess<'a, R> {
1913 fn new(de: &'a mut Deserializer<R>) -> Self {
1914 SeqAccess { de, first: true }
1915 }
1916}
1917
1918impl<'de, 'a, R: Read<'de> + 'a> de::SeqAccess<'de> for SeqAccess<'a, R> {
1919 type Error = Error;
1920
1921 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
1922 where
1923 T: de::DeserializeSeed<'de>,
1924 {
1925 let peek = match tri!(self.de.parse_whitespace()) {
1926 Some(b']') => {
1927 return Ok(None);
1928 }
1929 Some(b',') if !self.first => {
1930 self.de.eat_char();
1931 tri!(self.de.parse_whitespace())
1932 }
1933 Some(b) => {
1934 if self.first {
1935 self.first = false;
1936 Some(b)
1937 } else {
1938 return Err(self.de.peek_error(ErrorCode::ExpectedListCommaOrEnd));
1939 }
1940 }
1941 None => {
1942 return Err(self.de.peek_error(ErrorCode::EofWhileParsingList));
1943 }
1944 };
1945
1946 match peek {
1947 Some(b']') => Err(self.de.peek_error(ErrorCode::TrailingComma)),
1948 Some(_) => Ok(Some(tri!(seed.deserialize(&mut *self.de)))),
1949 None => Err(self.de.peek_error(ErrorCode::EofWhileParsingValue)),
1950 }
1951 }
1952}
1953
1954struct MapAccess<'a, R: 'a> {
1955 de: &'a mut Deserializer<R>,
1956 first: bool,
1957}
1958
1959impl<'a, R: 'a> MapAccess<'a, R> {
1960 fn new(de: &'a mut Deserializer<R>) -> Self {
1961 MapAccess { de, first: true }
1962 }
1963}
1964
1965impl<'de, 'a, R: Read<'de> + 'a> de::MapAccess<'de> for MapAccess<'a, R> {
1966 type Error = Error;
1967
1968 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
1969 where
1970 K: de::DeserializeSeed<'de>,
1971 {
1972 let peek = match tri!(self.de.parse_whitespace()) {
1973 Some(b'}') => {
1974 return Ok(None);
1975 }
1976 Some(b',') if !self.first => {
1977 self.de.eat_char();
1978 tri!(self.de.parse_whitespace())
1979 }
1980 Some(b) => {
1981 if self.first {
1982 self.first = false;
1983 Some(b)
1984 } else {
1985 return Err(self.de.peek_error(ErrorCode::ExpectedObjectCommaOrEnd));
1986 }
1987 }
1988 None => {
1989 return Err(self.de.peek_error(ErrorCode::EofWhileParsingObject));
1990 }
1991 };
1992
1993 match peek {
1994 Some(b'"') => seed.deserialize(MapKey { de: &mut *self.de }).map(Some),
1995 Some(b'}') => Err(self.de.peek_error(ErrorCode::TrailingComma)),
1996 Some(_) => Err(self.de.peek_error(ErrorCode::KeyMustBeAString)),
1997 None => Err(self.de.peek_error(ErrorCode::EofWhileParsingValue)),
1998 }
1999 }
2000
2001 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
2002 where
2003 V: de::DeserializeSeed<'de>,
2004 {
2005 tri!(self.de.parse_object_colon());
2006
2007 seed.deserialize(&mut *self.de)
2008 }
2009}
2010
2011struct VariantAccess<'a, R: 'a> {
2012 de: &'a mut Deserializer<R>,
2013}
2014
2015impl<'a, R: 'a> VariantAccess<'a, R> {
2016 fn new(de: &'a mut Deserializer<R>) -> Self {
2017 VariantAccess { de }
2018 }
2019}
2020
2021impl<'de, 'a, R: Read<'de> + 'a> de::EnumAccess<'de> for VariantAccess<'a, R> {
2022 type Error = Error;
2023 type Variant = Self;
2024
2025 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self)>
2026 where
2027 V: de::DeserializeSeed<'de>,
2028 {
2029 let val = tri!(seed.deserialize(&mut *self.de));
2030 tri!(self.de.parse_object_colon());
2031 Ok((val, self))
2032 }
2033}
2034
2035impl<'de, 'a, R: Read<'de> + 'a> de::VariantAccess<'de> for VariantAccess<'a, R> {
2036 type Error = Error;
2037
2038 fn unit_variant(self) -> Result<()> {
2039 de::Deserialize::deserialize(self.de)
2040 }
2041
2042 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
2043 where
2044 T: de::DeserializeSeed<'de>,
2045 {
2046 seed.deserialize(self.de)
2047 }
2048
2049 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value>
2050 where
2051 V: de::Visitor<'de>,
2052 {
2053 de::Deserializer::deserialize_seq(self.de, visitor)
2054 }
2055
2056 fn struct_variant<V>(self, fields: &'static [&'static str], visitor: V) -> Result<V::Value>
2057 where
2058 V: de::Visitor<'de>,
2059 {
2060 de::Deserializer::deserialize_struct(self.de, "", fields, visitor)
2061 }
2062}
2063
2064struct UnitVariantAccess<'a, R: 'a> {
2065 de: &'a mut Deserializer<R>,
2066}
2067
2068impl<'a, R: 'a> UnitVariantAccess<'a, R> {
2069 fn new(de: &'a mut Deserializer<R>) -> Self {
2070 UnitVariantAccess { de }
2071 }
2072}
2073
2074impl<'de, 'a, R: Read<'de> + 'a> de::EnumAccess<'de> for UnitVariantAccess<'a, R> {
2075 type Error = Error;
2076 type Variant = Self;
2077
2078 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self)>
2079 where
2080 V: de::DeserializeSeed<'de>,
2081 {
2082 let variant = tri!(seed.deserialize(&mut *self.de));
2083 Ok((variant, self))
2084 }
2085}
2086
2087impl<'de, 'a, R: Read<'de> + 'a> de::VariantAccess<'de> for UnitVariantAccess<'a, R> {
2088 type Error = Error;
2089
2090 fn unit_variant(self) -> Result<()> {
2091 Ok(())
2092 }
2093
2094 fn newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value>
2095 where
2096 T: de::DeserializeSeed<'de>,
2097 {
2098 Err(de::Error::invalid_type(
2099 Unexpected::UnitVariant,
2100 &"newtype variant",
2101 ))
2102 }
2103
2104 fn tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value>
2105 where
2106 V: de::Visitor<'de>,
2107 {
2108 Err(de::Error::invalid_type(
2109 Unexpected::UnitVariant,
2110 &"tuple variant",
2111 ))
2112 }
2113
2114 fn struct_variant<V>(self, _fields: &'static [&'static str], _visitor: V) -> Result<V::Value>
2115 where
2116 V: de::Visitor<'de>,
2117 {
2118 Err(de::Error::invalid_type(
2119 Unexpected::UnitVariant,
2120 &"struct variant",
2121 ))
2122 }
2123}
2124
2125struct MapKey<'a, R: 'a> {
2128 de: &'a mut Deserializer<R>,
2129}
2130
2131macro_rules! deserialize_numeric_key {
2132 ($method:ident) => {
2133 fn $method<V>(self, visitor: V) -> Result<V::Value>
2134 where
2135 V: de::Visitor<'de>,
2136 {
2137 self.deserialize_number(visitor)
2138 }
2139 };
2140
2141 ($method:ident, $delegate:ident) => {
2142 fn $method<V>(self, visitor: V) -> Result<V::Value>
2143 where
2144 V: de::Visitor<'de>,
2145 {
2146 self.de.eat_char();
2147
2148 match tri!(self.de.peek()) {
2149 Some(b'0'..=b'9' | b'-') => {}
2150 _ => return Err(self.de.error(ErrorCode::ExpectedNumericKey)),
2151 }
2152
2153 let value = tri!(self.de.$delegate(visitor));
2154
2155 match tri!(self.de.peek()) {
2156 Some(b'"') => self.de.eat_char(),
2157 _ => return Err(self.de.peek_error(ErrorCode::ExpectedDoubleQuote)),
2158 }
2159
2160 Ok(value)
2161 }
2162 };
2163}
2164
2165impl<'de, 'a, R> MapKey<'a, R>
2166where
2167 R: Read<'de>,
2168{
2169 deserialize_numeric_key!(deserialize_number, deserialize_number);
2170}
2171
2172impl<'de, 'a, R> de::Deserializer<'de> for MapKey<'a, R>
2173where
2174 R: Read<'de>,
2175{
2176 type Error = Error;
2177
2178 #[inline]
2179 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
2180 where
2181 V: de::Visitor<'de>,
2182 {
2183 self.de.eat_char();
2184 self.de.scratch.clear();
2185 match tri!(self.de.read.parse_str(&mut self.de.scratch)) {
2186 Reference::Borrowed(s) => visitor.visit_borrowed_str(s),
2187 Reference::Copied(s) => visitor.visit_str(s),
2188 }
2189 }
2190
2191 deserialize_numeric_key!(deserialize_i8);
2192 deserialize_numeric_key!(deserialize_i16);
2193 deserialize_numeric_key!(deserialize_i32);
2194 deserialize_numeric_key!(deserialize_i64);
2195 deserialize_numeric_key!(deserialize_i128, deserialize_i128);
2196 deserialize_numeric_key!(deserialize_u8);
2197 deserialize_numeric_key!(deserialize_u16);
2198 deserialize_numeric_key!(deserialize_u32);
2199 deserialize_numeric_key!(deserialize_u64);
2200 deserialize_numeric_key!(deserialize_u128, deserialize_u128);
2201 #[cfg(not(feature = "float_roundtrip"))]
2202 deserialize_numeric_key!(deserialize_f32);
2203 #[cfg(feature = "float_roundtrip")]
2204 deserialize_numeric_key!(deserialize_f32, deserialize_f32);
2205 deserialize_numeric_key!(deserialize_f64);
2206
2207 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
2208 where
2209 V: de::Visitor<'de>,
2210 {
2211 self.de.eat_char();
2212
2213 let peek = match tri!(self.de.next_char()) {
2214 Some(b) => b,
2215 None => {
2216 return Err(self.de.peek_error(ErrorCode::EofWhileParsingValue));
2217 }
2218 };
2219
2220 let value = match peek {
2221 b't' => {
2222 tri!(self.de.parse_ident(b"rue\""));
2223 visitor.visit_bool(true)
2224 }
2225 b'f' => {
2226 tri!(self.de.parse_ident(b"alse\""));
2227 visitor.visit_bool(false)
2228 }
2229 _ => {
2230 self.de.scratch.clear();
2231 let s = tri!(self.de.read.parse_str(&mut self.de.scratch));
2232 Err(de::Error::invalid_type(Unexpected::Str(&s), &visitor))
2233 }
2234 };
2235
2236 match value {
2237 Ok(value) => Ok(value),
2238 Err(err) => Err(self.de.fix_position(err)),
2239 }
2240 }
2241
2242 #[inline]
2243 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
2244 where
2245 V: de::Visitor<'de>,
2246 {
2247 visitor.visit_some(self)
2249 }
2250
2251 #[inline]
2252 fn deserialize_newtype_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
2253 where
2254 V: de::Visitor<'de>,
2255 {
2256 #[cfg(feature = "raw_value")]
2257 {
2258 if name == crate::raw::TOKEN {
2259 return self.de.deserialize_raw_value(visitor);
2260 }
2261 }
2262
2263 let _ = name;
2264 visitor.visit_newtype_struct(self)
2265 }
2266
2267 #[inline]
2268 fn deserialize_enum<V>(
2269 self,
2270 name: &'static str,
2271 variants: &'static [&'static str],
2272 visitor: V,
2273 ) -> Result<V::Value>
2274 where
2275 V: de::Visitor<'de>,
2276 {
2277 self.de.deserialize_enum(name, variants, visitor)
2278 }
2279
2280 #[inline]
2281 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
2282 where
2283 V: de::Visitor<'de>,
2284 {
2285 self.de.deserialize_bytes(visitor)
2286 }
2287
2288 #[inline]
2289 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
2290 where
2291 V: de::Visitor<'de>,
2292 {
2293 self.de.deserialize_bytes(visitor)
2294 }
2295
2296 forward_to_deserialize_any! {
2297 char str string unit unit_struct seq tuple tuple_struct map struct
2298 identifier ignored_any
2299 }
2300}
2301
2302pub struct StreamDeserializer<'de, R, T> {
2326 de: Deserializer<R>,
2327 offset: usize,
2328 failed: bool,
2329 output: PhantomData<T>,
2330 lifetime: PhantomData<&'de ()>,
2331}
2332
2333impl<'de, R, T> StreamDeserializer<'de, R, T>
2334where
2335 R: read::Read<'de>,
2336 T: de::Deserialize<'de>,
2337{
2338 pub fn new(read: R) -> Self {
2347 let offset = read.byte_offset();
2348 StreamDeserializer {
2349 de: Deserializer::new(read),
2350 offset,
2351 failed: false,
2352 output: PhantomData,
2353 lifetime: PhantomData,
2354 }
2355 }
2356
2357 pub fn byte_offset(&self) -> usize {
2389 self.offset
2390 }
2391
2392 fn peek_end_of_value(&mut self) -> Result<()> {
2393 match tri!(self.de.peek()) {
2394 Some(b' ' | b'\n' | b'\t' | b'\r' | b'"' | b'[' | b']' | b'{' | b'}' | b',' | b':')
2395 | None => Ok(()),
2396 Some(_) => {
2397 let position = self.de.read.peek_position();
2398 Err(Error::syntax(
2399 ErrorCode::TrailingCharacters,
2400 position.line,
2401 position.column,
2402 ))
2403 }
2404 }
2405 }
2406}
2407
2408impl<'de, R, T> Iterator for StreamDeserializer<'de, R, T>
2409where
2410 R: Read<'de>,
2411 T: de::Deserialize<'de>,
2412{
2413 type Item = Result<T>;
2414
2415 fn next(&mut self) -> Option<Result<T>> {
2416 if R::should_early_return_if_failed && self.failed {
2417 return None;
2418 }
2419
2420 match self.de.parse_whitespace() {
2424 Ok(None) => {
2425 self.offset = self.de.read.byte_offset();
2426 None
2427 }
2428 Ok(Some(b)) => {
2429 let self_delineated_value = match b {
2433 b'[' | b'"' | b'{' => true,
2434 _ => false,
2435 };
2436 self.offset = self.de.read.byte_offset();
2437 let result = de::Deserialize::deserialize(&mut self.de);
2438
2439 Some(match result {
2440 Ok(value) => {
2441 self.offset = self.de.read.byte_offset();
2442 if self_delineated_value {
2443 Ok(value)
2444 } else {
2445 self.peek_end_of_value().map(|()| value)
2446 }
2447 }
2448 Err(e) => {
2449 self.de.read.set_failed(&mut self.failed);
2450 Err(e)
2451 }
2452 })
2453 }
2454 Err(e) => {
2455 self.de.read.set_failed(&mut self.failed);
2456 Some(Err(e))
2457 }
2458 }
2459 }
2460}
2461
2462impl<'de, R, T> FusedIterator for StreamDeserializer<'de, R, T>
2463where
2464 R: Read<'de> + Fused,
2465 T: de::Deserialize<'de>,
2466{
2467}
2468
2469fn from_trait<'de, R, T>(read: R) -> Result<T>
2472where
2473 R: Read<'de>,
2474 T: de::Deserialize<'de>,
2475{
2476 let mut de = Deserializer::new(read);
2477 let value = tri!(de::Deserialize::deserialize(&mut de));
2478
2479 tri!(de.end());
2481 Ok(value)
2482}
2483
2484#[cfg(feature = "std")]
2588#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
2589pub fn from_reader<R, T>(rdr: R) -> Result<T>
2590where
2591 R: crate::io::Read,
2592 T: de::DeserializeOwned,
2593{
2594 from_trait(read::IoRead::new(rdr))
2595}
2596
2597pub fn from_slice<'a, T>(v: &'a [u8]) -> Result<T>
2633where
2634 T: de::Deserialize<'a>,
2635{
2636 from_trait(read::SliceRead::new(v))
2637}
2638
2639pub fn from_str<'a, T>(s: &'a str) -> Result<T>
2675where
2676 T: de::Deserialize<'a>,
2677{
2678 from_trait(read::StrRead::new(s))
2679}