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) {
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) {
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) {
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) {
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, R: Read<'de>> de::Deserializer<'de> for &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>
1626 where
1627 V: de::Visitor<'de>,
1628 {
1629 let peek = match tri!(self.parse_whitespace()) {
1630 Some(b) => b,
1631 None => {
1632 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1633 }
1634 };
1635
1636 let value = match peek {
1637 b'"' => {
1638 self.eat_char();
1639 self.scratch.clear();
1640 match tri!(self.read.parse_str_raw(&mut self.scratch)) {
1641 Reference::Borrowed(b) => visitor.visit_borrowed_bytes(b),
1642 Reference::Copied(b) => visitor.visit_bytes(b),
1643 }
1644 }
1645 b'[' => self.deserialize_seq(visitor),
1646 _ => Err(self.peek_invalid_type(&visitor)),
1647 };
1648
1649 match value {
1650 Ok(value) => Ok(value),
1651 Err(err) => Err(self.fix_position(err)),
1652 }
1653 }
1654
1655 #[inline]
1656 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
1657 where
1658 V: de::Visitor<'de>,
1659 {
1660 self.deserialize_bytes(visitor)
1661 }
1662
1663 #[inline]
1665 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
1666 where
1667 V: de::Visitor<'de>,
1668 {
1669 match tri!(self.parse_whitespace()) {
1670 Some(b'n') => {
1671 self.eat_char();
1672 tri!(self.parse_ident(b"ull"));
1673 visitor.visit_none()
1674 }
1675 _ => visitor.visit_some(self),
1676 }
1677 }
1678
1679 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
1680 where
1681 V: de::Visitor<'de>,
1682 {
1683 let peek = match tri!(self.parse_whitespace()) {
1684 Some(b) => b,
1685 None => {
1686 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1687 }
1688 };
1689
1690 let value = match peek {
1691 b'n' => {
1692 self.eat_char();
1693 tri!(self.parse_ident(b"ull"));
1694 visitor.visit_unit()
1695 }
1696 _ => Err(self.peek_invalid_type(&visitor)),
1697 };
1698
1699 match value {
1700 Ok(value) => Ok(value),
1701 Err(err) => Err(self.fix_position(err)),
1702 }
1703 }
1704
1705 fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
1706 where
1707 V: de::Visitor<'de>,
1708 {
1709 self.deserialize_unit(visitor)
1710 }
1711
1712 #[inline]
1714 fn deserialize_newtype_struct<V>(self, name: &str, visitor: V) -> Result<V::Value>
1715 where
1716 V: de::Visitor<'de>,
1717 {
1718 #[cfg(feature = "raw_value")]
1719 {
1720 if name == crate::raw::TOKEN {
1721 return self.deserialize_raw_value(visitor);
1722 }
1723 }
1724
1725 let _ = name;
1726 visitor.visit_newtype_struct(self)
1727 }
1728
1729 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
1730 where
1731 V: de::Visitor<'de>,
1732 {
1733 let peek = match tri!(self.parse_whitespace()) {
1734 Some(b) => b,
1735 None => {
1736 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1737 }
1738 };
1739
1740 let value = match peek {
1741 b'[' => {
1742 check_recursion! {
1743 self.eat_char();
1744 let ret = visitor.visit_seq(SeqAccess::new(self));
1745 }
1746
1747 match (ret, self.end_seq()) {
1748 (Ok(ret), Ok(())) => Ok(ret),
1749 (Err(err), _) | (_, Err(err)) => Err(err),
1750 }
1751 }
1752 _ => Err(self.peek_invalid_type(&visitor)),
1753 };
1754
1755 match value {
1756 Ok(value) => Ok(value),
1757 Err(err) => Err(self.fix_position(err)),
1758 }
1759 }
1760
1761 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
1762 where
1763 V: de::Visitor<'de>,
1764 {
1765 self.deserialize_seq(visitor)
1766 }
1767
1768 fn deserialize_tuple_struct<V>(
1769 self,
1770 _name: &'static str,
1771 _len: usize,
1772 visitor: V,
1773 ) -> Result<V::Value>
1774 where
1775 V: de::Visitor<'de>,
1776 {
1777 self.deserialize_seq(visitor)
1778 }
1779
1780 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
1781 where
1782 V: de::Visitor<'de>,
1783 {
1784 let peek = match tri!(self.parse_whitespace()) {
1785 Some(b) => b,
1786 None => {
1787 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1788 }
1789 };
1790
1791 let value = match peek {
1792 b'{' => {
1793 check_recursion! {
1794 self.eat_char();
1795 let ret = visitor.visit_map(MapAccess::new(self));
1796 }
1797
1798 match (ret, self.end_map()) {
1799 (Ok(ret), Ok(())) => Ok(ret),
1800 (Err(err), _) | (_, Err(err)) => Err(err),
1801 }
1802 }
1803 _ => Err(self.peek_invalid_type(&visitor)),
1804 };
1805
1806 match value {
1807 Ok(value) => Ok(value),
1808 Err(err) => Err(self.fix_position(err)),
1809 }
1810 }
1811
1812 fn deserialize_struct<V>(
1813 self,
1814 _name: &'static str,
1815 _fields: &'static [&'static str],
1816 visitor: V,
1817 ) -> Result<V::Value>
1818 where
1819 V: de::Visitor<'de>,
1820 {
1821 let peek = match tri!(self.parse_whitespace()) {
1822 Some(b) => b,
1823 None => {
1824 return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1825 }
1826 };
1827
1828 let value = match peek {
1829 b'[' => {
1830 check_recursion! {
1831 self.eat_char();
1832 let ret = visitor.visit_seq(SeqAccess::new(self));
1833 }
1834
1835 match (ret, self.end_seq()) {
1836 (Ok(ret), Ok(())) => Ok(ret),
1837 (Err(err), _) | (_, Err(err)) => Err(err),
1838 }
1839 }
1840 b'{' => {
1841 check_recursion! {
1842 self.eat_char();
1843 let ret = visitor.visit_map(MapAccess::new(self));
1844 }
1845
1846 match (ret, self.end_map()) {
1847 (Ok(ret), Ok(())) => Ok(ret),
1848 (Err(err), _) | (_, Err(err)) => Err(err),
1849 }
1850 }
1851 _ => Err(self.peek_invalid_type(&visitor)),
1852 };
1853
1854 match value {
1855 Ok(value) => Ok(value),
1856 Err(err) => Err(self.fix_position(err)),
1857 }
1858 }
1859
1860 #[inline]
1863 fn deserialize_enum<V>(
1864 self,
1865 _name: &str,
1866 _variants: &'static [&'static str],
1867 visitor: V,
1868 ) -> Result<V::Value>
1869 where
1870 V: de::Visitor<'de>,
1871 {
1872 match tri!(self.parse_whitespace()) {
1873 Some(b'{') => {
1874 check_recursion! {
1875 self.eat_char();
1876 let ret = visitor.visit_enum(VariantAccess::new(self));
1877 }
1878 let value = tri!(ret);
1879
1880 match tri!(self.parse_whitespace()) {
1881 Some(b'}') => {
1882 self.eat_char();
1883 Ok(value)
1884 }
1885 Some(_) => Err(self.error(ErrorCode::ExpectedSomeValue)),
1886 None => Err(self.error(ErrorCode::EofWhileParsingObject)),
1887 }
1888 }
1889 Some(b'"') => visitor.visit_enum(UnitVariantAccess::new(self)),
1890 Some(_) => Err(self.peek_error(ErrorCode::ExpectedSomeValue)),
1891 None => Err(self.peek_error(ErrorCode::EofWhileParsingValue)),
1892 }
1893 }
1894
1895 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
1896 where
1897 V: de::Visitor<'de>,
1898 {
1899 self.deserialize_str(visitor)
1900 }
1901
1902 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
1903 where
1904 V: de::Visitor<'de>,
1905 {
1906 tri!(self.ignore_value());
1907 visitor.visit_unit()
1908 }
1909}
1910
1911struct SeqAccess<'a, R: 'a> {
1912 de: &'a mut Deserializer<R>,
1913 first: bool,
1914}
1915
1916impl<'a, R: 'a> SeqAccess<'a, R> {
1917 fn new(de: &'a mut Deserializer<R>) -> Self {
1918 SeqAccess { de, first: true }
1919 }
1920}
1921
1922impl<'de, 'a, R: Read<'de> + 'a> de::SeqAccess<'de> for SeqAccess<'a, R> {
1923 type Error = Error;
1924
1925 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
1926 where
1927 T: de::DeserializeSeed<'de>,
1928 {
1929 fn has_next_element<'de, 'a, R: Read<'de> + 'a>(
1930 seq: &mut SeqAccess<'a, R>,
1931 ) -> Result<bool> {
1932 let peek = match tri!(seq.de.parse_whitespace()) {
1933 Some(b) => b,
1934 None => {
1935 return Err(seq.de.peek_error(ErrorCode::EofWhileParsingList));
1936 }
1937 };
1938
1939 if peek == b']' {
1940 Ok(false)
1941 } else if seq.first {
1942 seq.first = false;
1943 Ok(true)
1944 } else if peek == b',' {
1945 seq.de.eat_char();
1946 match tri!(seq.de.parse_whitespace()) {
1947 Some(b']') => Err(seq.de.peek_error(ErrorCode::TrailingComma)),
1948 Some(_) => Ok(true),
1949 None => Err(seq.de.peek_error(ErrorCode::EofWhileParsingValue)),
1950 }
1951 } else {
1952 Err(seq.de.peek_error(ErrorCode::ExpectedListCommaOrEnd))
1953 }
1954 }
1955
1956 if tri!(has_next_element(self)) {
1957 Ok(Some(tri!(seed.deserialize(&mut *self.de))))
1958 } else {
1959 Ok(None)
1960 }
1961 }
1962}
1963
1964struct MapAccess<'a, R: 'a> {
1965 de: &'a mut Deserializer<R>,
1966 first: bool,
1967}
1968
1969impl<'a, R: 'a> MapAccess<'a, R> {
1970 fn new(de: &'a mut Deserializer<R>) -> Self {
1971 MapAccess { de, first: true }
1972 }
1973}
1974
1975impl<'de, 'a, R: Read<'de> + 'a> de::MapAccess<'de> for MapAccess<'a, R> {
1976 type Error = Error;
1977
1978 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
1979 where
1980 K: de::DeserializeSeed<'de>,
1981 {
1982 fn has_next_key<'de, 'a, R: Read<'de> + 'a>(map: &mut MapAccess<'a, R>) -> Result<bool> {
1983 let peek = match tri!(map.de.parse_whitespace()) {
1984 Some(b) => b,
1985 None => {
1986 return Err(map.de.peek_error(ErrorCode::EofWhileParsingObject));
1987 }
1988 };
1989
1990 if peek == b'}' {
1991 Ok(false)
1992 } else if map.first {
1993 map.first = false;
1994 if peek == b'"' {
1995 Ok(true)
1996 } else {
1997 Err(map.de.peek_error(ErrorCode::KeyMustBeAString))
1998 }
1999 } else if peek == b',' {
2000 map.de.eat_char();
2001 match tri!(map.de.parse_whitespace()) {
2002 Some(b'"') => Ok(true),
2003 Some(b'}') => Err(map.de.peek_error(ErrorCode::TrailingComma)),
2004 Some(_) => Err(map.de.peek_error(ErrorCode::KeyMustBeAString)),
2005 None => Err(map.de.peek_error(ErrorCode::EofWhileParsingValue)),
2006 }
2007 } else {
2008 Err(map.de.peek_error(ErrorCode::ExpectedObjectCommaOrEnd))
2009 }
2010 }
2011
2012 if tri!(has_next_key(self)) {
2013 Ok(Some(tri!(seed.deserialize(MapKey { de: &mut *self.de }))))
2014 } else {
2015 Ok(None)
2016 }
2017 }
2018
2019 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
2020 where
2021 V: de::DeserializeSeed<'de>,
2022 {
2023 tri!(self.de.parse_object_colon());
2024
2025 seed.deserialize(&mut *self.de)
2026 }
2027}
2028
2029struct VariantAccess<'a, R: 'a> {
2030 de: &'a mut Deserializer<R>,
2031}
2032
2033impl<'a, R: 'a> VariantAccess<'a, R> {
2034 fn new(de: &'a mut Deserializer<R>) -> Self {
2035 VariantAccess { de }
2036 }
2037}
2038
2039impl<'de, 'a, R: Read<'de> + 'a> de::EnumAccess<'de> for VariantAccess<'a, R> {
2040 type Error = Error;
2041 type Variant = Self;
2042
2043 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self)>
2044 where
2045 V: de::DeserializeSeed<'de>,
2046 {
2047 let val = tri!(seed.deserialize(&mut *self.de));
2048 tri!(self.de.parse_object_colon());
2049 Ok((val, self))
2050 }
2051}
2052
2053impl<'de, 'a, R: Read<'de> + 'a> de::VariantAccess<'de> for VariantAccess<'a, R> {
2054 type Error = Error;
2055
2056 fn unit_variant(self) -> Result<()> {
2057 de::Deserialize::deserialize(self.de)
2058 }
2059
2060 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
2061 where
2062 T: de::DeserializeSeed<'de>,
2063 {
2064 seed.deserialize(self.de)
2065 }
2066
2067 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value>
2068 where
2069 V: de::Visitor<'de>,
2070 {
2071 de::Deserializer::deserialize_seq(self.de, visitor)
2072 }
2073
2074 fn struct_variant<V>(self, fields: &'static [&'static str], visitor: V) -> Result<V::Value>
2075 where
2076 V: de::Visitor<'de>,
2077 {
2078 de::Deserializer::deserialize_struct(self.de, "", fields, visitor)
2079 }
2080}
2081
2082struct UnitVariantAccess<'a, R: 'a> {
2083 de: &'a mut Deserializer<R>,
2084}
2085
2086impl<'a, R: 'a> UnitVariantAccess<'a, R> {
2087 fn new(de: &'a mut Deserializer<R>) -> Self {
2088 UnitVariantAccess { de }
2089 }
2090}
2091
2092impl<'de, 'a, R: Read<'de> + 'a> de::EnumAccess<'de> for UnitVariantAccess<'a, R> {
2093 type Error = Error;
2094 type Variant = Self;
2095
2096 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self)>
2097 where
2098 V: de::DeserializeSeed<'de>,
2099 {
2100 let variant = tri!(seed.deserialize(&mut *self.de));
2101 Ok((variant, self))
2102 }
2103}
2104
2105impl<'de, 'a, R: Read<'de> + 'a> de::VariantAccess<'de> for UnitVariantAccess<'a, R> {
2106 type Error = Error;
2107
2108 fn unit_variant(self) -> Result<()> {
2109 Ok(())
2110 }
2111
2112 fn newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value>
2113 where
2114 T: de::DeserializeSeed<'de>,
2115 {
2116 Err(de::Error::invalid_type(
2117 Unexpected::UnitVariant,
2118 &"newtype variant",
2119 ))
2120 }
2121
2122 fn tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value>
2123 where
2124 V: de::Visitor<'de>,
2125 {
2126 Err(de::Error::invalid_type(
2127 Unexpected::UnitVariant,
2128 &"tuple variant",
2129 ))
2130 }
2131
2132 fn struct_variant<V>(self, _fields: &'static [&'static str], _visitor: V) -> Result<V::Value>
2133 where
2134 V: de::Visitor<'de>,
2135 {
2136 Err(de::Error::invalid_type(
2137 Unexpected::UnitVariant,
2138 &"struct variant",
2139 ))
2140 }
2141}
2142
2143struct MapKey<'a, R: 'a> {
2146 de: &'a mut Deserializer<R>,
2147}
2148
2149macro_rules! deserialize_numeric_key {
2150 ($method:ident) => {
2151 fn $method<V>(self, visitor: V) -> Result<V::Value>
2152 where
2153 V: de::Visitor<'de>,
2154 {
2155 self.deserialize_number(visitor)
2156 }
2157 };
2158
2159 ($method:ident, $delegate:ident) => {
2160 fn $method<V>(self, visitor: V) -> Result<V::Value>
2161 where
2162 V: de::Visitor<'de>,
2163 {
2164 self.de.eat_char();
2165
2166 match tri!(self.de.peek()) {
2167 Some(b'0'..=b'9' | b'-') => {}
2168 _ => return Err(self.de.error(ErrorCode::ExpectedNumericKey)),
2169 }
2170
2171 let value = tri!(self.de.$delegate(visitor));
2172
2173 match tri!(self.de.peek()) {
2174 Some(b'"') => self.de.eat_char(),
2175 _ => return Err(self.de.peek_error(ErrorCode::ExpectedDoubleQuote)),
2176 }
2177
2178 Ok(value)
2179 }
2180 };
2181}
2182
2183impl<'de, 'a, R> MapKey<'a, R>
2184where
2185 R: Read<'de>,
2186{
2187 deserialize_numeric_key!(deserialize_number, deserialize_number);
2188}
2189
2190impl<'de, 'a, R> de::Deserializer<'de> for MapKey<'a, R>
2191where
2192 R: Read<'de>,
2193{
2194 type Error = Error;
2195
2196 #[inline]
2197 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
2198 where
2199 V: de::Visitor<'de>,
2200 {
2201 self.de.eat_char();
2202 self.de.scratch.clear();
2203 match tri!(self.de.read.parse_str(&mut self.de.scratch)) {
2204 Reference::Borrowed(s) => visitor.visit_borrowed_str(s),
2205 Reference::Copied(s) => visitor.visit_str(s),
2206 }
2207 }
2208
2209 deserialize_numeric_key!(deserialize_i8);
2210 deserialize_numeric_key!(deserialize_i16);
2211 deserialize_numeric_key!(deserialize_i32);
2212 deserialize_numeric_key!(deserialize_i64);
2213 deserialize_numeric_key!(deserialize_i128, deserialize_i128);
2214 deserialize_numeric_key!(deserialize_u8);
2215 deserialize_numeric_key!(deserialize_u16);
2216 deserialize_numeric_key!(deserialize_u32);
2217 deserialize_numeric_key!(deserialize_u64);
2218 deserialize_numeric_key!(deserialize_u128, deserialize_u128);
2219 #[cfg(not(feature = "float_roundtrip"))]
2220 deserialize_numeric_key!(deserialize_f32);
2221 #[cfg(feature = "float_roundtrip")]
2222 deserialize_numeric_key!(deserialize_f32, deserialize_f32);
2223 deserialize_numeric_key!(deserialize_f64);
2224
2225 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
2226 where
2227 V: de::Visitor<'de>,
2228 {
2229 self.de.eat_char();
2230
2231 let peek = match tri!(self.de.next_char()) {
2232 Some(b) => b,
2233 None => {
2234 return Err(self.de.peek_error(ErrorCode::EofWhileParsingValue));
2235 }
2236 };
2237
2238 let value = match peek {
2239 b't' => {
2240 tri!(self.de.parse_ident(b"rue\""));
2241 visitor.visit_bool(true)
2242 }
2243 b'f' => {
2244 tri!(self.de.parse_ident(b"alse\""));
2245 visitor.visit_bool(false)
2246 }
2247 _ => {
2248 self.de.scratch.clear();
2249 let s = tri!(self.de.read.parse_str(&mut self.de.scratch));
2250 Err(de::Error::invalid_type(Unexpected::Str(&s), &visitor))
2251 }
2252 };
2253
2254 match value {
2255 Ok(value) => Ok(value),
2256 Err(err) => Err(self.de.fix_position(err)),
2257 }
2258 }
2259
2260 #[inline]
2261 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
2262 where
2263 V: de::Visitor<'de>,
2264 {
2265 visitor.visit_some(self)
2267 }
2268
2269 #[inline]
2270 fn deserialize_newtype_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
2271 where
2272 V: de::Visitor<'de>,
2273 {
2274 #[cfg(feature = "raw_value")]
2275 {
2276 if name == crate::raw::TOKEN {
2277 return self.de.deserialize_raw_value(visitor);
2278 }
2279 }
2280
2281 let _ = name;
2282 visitor.visit_newtype_struct(self)
2283 }
2284
2285 #[inline]
2286 fn deserialize_enum<V>(
2287 self,
2288 name: &'static str,
2289 variants: &'static [&'static str],
2290 visitor: V,
2291 ) -> Result<V::Value>
2292 where
2293 V: de::Visitor<'de>,
2294 {
2295 self.de.deserialize_enum(name, variants, visitor)
2296 }
2297
2298 #[inline]
2299 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
2300 where
2301 V: de::Visitor<'de>,
2302 {
2303 self.de.deserialize_bytes(visitor)
2304 }
2305
2306 #[inline]
2307 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
2308 where
2309 V: de::Visitor<'de>,
2310 {
2311 self.de.deserialize_bytes(visitor)
2312 }
2313
2314 forward_to_deserialize_any! {
2315 char str string unit unit_struct seq tuple tuple_struct map struct
2316 identifier ignored_any
2317 }
2318}
2319
2320pub struct StreamDeserializer<'de, R, T> {
2344 de: Deserializer<R>,
2345 offset: usize,
2346 failed: bool,
2347 output: PhantomData<T>,
2348 lifetime: PhantomData<&'de ()>,
2349}
2350
2351impl<'de, R, T> StreamDeserializer<'de, R, T>
2352where
2353 R: read::Read<'de>,
2354 T: de::Deserialize<'de>,
2355{
2356 pub fn new(read: R) -> Self {
2365 let offset = read.byte_offset();
2366 StreamDeserializer {
2367 de: Deserializer::new(read),
2368 offset,
2369 failed: false,
2370 output: PhantomData,
2371 lifetime: PhantomData,
2372 }
2373 }
2374
2375 pub fn byte_offset(&self) -> usize {
2407 self.offset
2408 }
2409
2410 fn peek_end_of_value(&mut self) -> Result<()> {
2411 match tri!(self.de.peek()) {
2412 Some(b' ' | b'\n' | b'\t' | b'\r' | b'"' | b'[' | b']' | b'{' | b'}' | b',' | b':')
2413 | None => Ok(()),
2414 Some(_) => {
2415 let position = self.de.read.peek_position();
2416 Err(Error::syntax(
2417 ErrorCode::TrailingCharacters,
2418 position.line,
2419 position.column,
2420 ))
2421 }
2422 }
2423 }
2424}
2425
2426impl<'de, R, T> Iterator for StreamDeserializer<'de, R, T>
2427where
2428 R: Read<'de>,
2429 T: de::Deserialize<'de>,
2430{
2431 type Item = Result<T>;
2432
2433 fn next(&mut self) -> Option<Result<T>> {
2434 if R::should_early_return_if_failed && self.failed {
2435 return None;
2436 }
2437
2438 match self.de.parse_whitespace() {
2442 Ok(None) => {
2443 self.offset = self.de.read.byte_offset();
2444 None
2445 }
2446 Ok(Some(b)) => {
2447 let self_delineated_value = match b {
2451 b'[' | b'"' | b'{' => true,
2452 _ => false,
2453 };
2454 self.offset = self.de.read.byte_offset();
2455 let result = de::Deserialize::deserialize(&mut self.de);
2456
2457 Some(match result {
2458 Ok(value) => {
2459 self.offset = self.de.read.byte_offset();
2460 if self_delineated_value {
2461 Ok(value)
2462 } else {
2463 self.peek_end_of_value().map(|()| value)
2464 }
2465 }
2466 Err(e) => {
2467 self.de.read.set_failed(&mut self.failed);
2468 Err(e)
2469 }
2470 })
2471 }
2472 Err(e) => {
2473 self.de.read.set_failed(&mut self.failed);
2474 Some(Err(e))
2475 }
2476 }
2477 }
2478}
2479
2480impl<'de, R, T> FusedIterator for StreamDeserializer<'de, R, T>
2481where
2482 R: Read<'de> + Fused,
2483 T: de::Deserialize<'de>,
2484{
2485}
2486
2487fn from_trait<'de, R, T>(read: R) -> Result<T>
2490where
2491 R: Read<'de>,
2492 T: de::Deserialize<'de>,
2493{
2494 let mut de = Deserializer::new(read);
2495 let value = tri!(de::Deserialize::deserialize(&mut de));
2496
2497 tri!(de.end());
2499 Ok(value)
2500}
2501
2502#[cfg(feature = "std")]
2606#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
2607pub fn from_reader<R, T>(rdr: R) -> Result<T>
2608where
2609 R: crate::io::Read,
2610 T: de::DeserializeOwned,
2611{
2612 from_trait(read::IoRead::new(rdr))
2613}
2614
2615pub fn from_slice<'a, T>(v: &'a [u8]) -> Result<T>
2651where
2652 T: de::Deserialize<'a>,
2653{
2654 from_trait(read::SliceRead::new(v))
2655}
2656
2657pub fn from_str<'a, T>(s: &'a str) -> Result<T>
2693where
2694 T: de::Deserialize<'a>,
2695{
2696 from_trait(read::StrRead::new(s))
2697}