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