Mercurial > core / rust/lib/sxp/src/de.rs
changeset 698: |
96958d3eb5b0 |
parent: |
1227f932b628
|
author: |
Richard Westhaver <ellis@rwest.io> |
date: |
Fri, 04 Oct 2024 22:04:59 -0400 |
permissions: |
-rw-r--r-- |
description: |
fixes |
1 //! de.rs --- SXP deserializer 2 use crate::read::{self, Fused, Reference}; 5 fmt::{DefaultFormatter, ReadFormatter}, 8 use alloc::string::String; 10 use core::iter::FusedIterator; 11 use core::marker::PhantomData; 12 use serde::de::{self, Deserialize, Expected, Unexpected}; 13 use serde::forward_to_deserialize_any; 15 pub use crate::read::{Read, SliceRead, StrRead}; 17 #[cfg(feature = "std")] 18 pub use crate::read::IoRead; 20 pub struct Deserializer<R,F> { 28 impl<'de, R: Read<'de>, F: ReadFormatter<'de>> Deserializer<R, F> { 29 pub fn new(read: R, formatter: F) -> Self { 40 #[cfg(feature = "std")] 41 impl<'de, R: Read<'de> + std::io::Read> 42 Deserializer<read::IoRead<R>, DefaultFormatter> 44 /// Creates a SXP deserializer from an `io::Read`. 46 /// Reader-based deserializers do not support deserializing borrowed types 47 /// like `&str`, since the `std::io::Read` trait has no non-copying methods 48 /// -- everything it does involves copying bytes out of the data source. 49 pub fn from_reader(reader: R) -> Self { 50 let f = DefaultFormatter; 51 Deserializer::new(read::IoRead::new(reader), f) 55 impl<'a> Deserializer<read::SliceRead<'a>, DefaultFormatter> { 56 /// Creates a SXP deserializer from a `&[u8]`. 57 pub fn from_slice(bytes: &'a [u8]) -> Self { 58 Deserializer::new(read::SliceRead::new(bytes), DefaultFormatter) 62 impl<'a> Deserializer<read::StrRead<'a>, DefaultFormatter> { 63 /// Creates a SXP deserializer from a `&str`. 64 pub fn from_str(s: &'a str) -> Self { 65 Deserializer::new(read::StrRead::new(s), DefaultFormatter) 69 macro_rules! overflow { 70 ($a:ident * 10 + $b:ident, $c:expr) => { 72 c => $a >= c / 10 && ($a > c / 10 || $b > c % 10), 77 pub(crate) enum ParserNumber { 84 fn visit<'de, V>(self, visitor: V) -> Result<V::Value> 89 ParserNumber::F64(x) => visitor.visit_f64(x), 90 ParserNumber::U64(x) => visitor.visit_u64(x), 91 ParserNumber::I64(x) => visitor.visit_i64(x), 95 fn invalid_type(self, exp: &dyn Expected) -> Error { 97 ParserNumber::F64(x) => { 98 de::Error::invalid_type(Unexpected::Float(x), exp) 100 ParserNumber::U64(x) => { 101 de::Error::invalid_type(Unexpected::Unsigned(x), exp) 103 ParserNumber::I64(x) => { 104 de::Error::invalid_type(Unexpected::Signed(x), exp) 110 impl<'de, R: Read<'de>, F: ReadFormatter<'de>> Deserializer<R, F> { 111 /// The `Deserializer::end` method should be called after a value has been 112 /// fully deserialized. This allows the `Deserializer` to validate that the 113 /// input stream is at the end or that it only has trailing whitespace. 114 pub fn end(&mut self) -> Result<()> { 115 match e!(self.parse_whitespace()) { 116 Some(_) => Err(self.peek_error(ErrorCode::TrailingCharacters)), 121 /// Turn a SXP deserializer into an iterator over values of type T. 122 pub fn into_iter<T>(self) -> StreamDeserializer<'de, R, F, T> 124 T: de::Deserialize<'de>, 126 // This cannot be an implementation of std::iter::IntoIterator because 127 // we need the caller to choose what T is. 128 let offset = self.read.byte_offset(); 134 lifetime: PhantomData, 138 #[cfg(feature = "unbound")] 139 /// Parse arbitrarily deep SXP structures without any consideration for 140 /// overflowing the stack. 142 /// You will want to provide some other way to protect against stack 143 /// overflows, such as by wrapping your Deserializer in the dynamically 144 /// growing stack adapter provided by the serde_stacker crate. Additionally 145 /// you will need to be careful around other recursive operations on the 146 /// parsed result which may overflow the stack after deserialization has 147 /// completed, including, but not limited to, Display and Debug and Drop 150 /// *This method is only available if sxp is built with the 151 /// `"unbound"` feature.* 152 pub fn disable_recursion_limit(&mut self) { 156 pub(crate) fn peek(&mut self) -> Result<Option<u8>> { 160 fn peek_or_null(&mut self) -> Result<u8> { 161 Ok(e!(self.peek()).unwrap_or(b'\x00')) 164 fn eat_char(&mut self) { 168 fn next_char(&mut self) -> Result<Option<u8>> { 172 fn next_char_or_null(&mut self) -> Result<u8> { 173 Ok(e!(self.next_char()).unwrap_or(b'\x00')) 176 /// Error caused by a byte from next_char(). 178 fn error(&self, reason: ErrorCode) -> Error { 179 let position = self.read.position(); 180 Error::syntax(reason, position.line, position.column) 183 /// Error caused by a byte from peek(). 185 fn peek_error(&self, reason: ErrorCode) -> Error { 186 let position = self.read.peek_position(); 187 Error::syntax(reason, position.line, position.column) 190 /// Returns the first non-whitespace byte without consuming it, or `None` if 191 /// EOF is encountered. 192 fn parse_whitespace(&mut self) -> Result<Option<u8>> { 194 match e!(self.peek()) { 195 Some(b' ' | b'\n' | b'\t' | b'\r') => { 206 fn peek_invalid_type(&mut self, exp: &dyn Expected) -> Error { 207 let err = match self.peek_or_null().unwrap_or(b'\x00') { 210 if let Err(err) = self.parse_ident(b"il") { 213 de::Error::invalid_type(Unexpected::Unit, exp) 215 // TODO 2023-07-14 : use read-symbol 218 if let Err(err) = self.parse_ident(b"rue") { 221 de::Error::invalid_type(Unexpected::Bool(true), exp) 225 if let Err(err) = self.parse_ident(b"") { 228 de::Error::invalid_type(Unexpected::Bool(false), exp) 232 match self.parse_any_number(false) { 233 Ok(n) => n.invalid_type(exp), 234 Err(err) => return err, 237 b'0'..=b'9' => match self.parse_any_number(true) { 238 Ok(n) => n.invalid_type(exp), 239 Err(err) => return err, 243 self.scratch.clear(); 244 match self.read.parse_str(&mut self.scratch) { 245 Ok(s) => de::Error::invalid_type(Unexpected::Str(&s), exp), 246 Err(err) => return err, 249 b'(' => de::Error::invalid_type(Unexpected::Seq, exp), 250 _ => self.peek_error(ErrorCode::ExpectedSomeValue), 253 self.fix_position(err) 256 pub(crate) fn deserialize_number<'any, V>( 259 ) -> Result<V::Value> 261 V: de::Visitor<'any>, 263 let peek = match e!(self.parse_whitespace()) { 266 return Err(self.peek_error(ErrorCode::EofWhileParsingValue)); 270 let value = match peek { 273 e!(self.parse_integer(false)).visit(visitor) 275 b'0'..=b'9' => e!(self.parse_integer(true)).visit(visitor), 276 _ => Err(self.peek_invalid_type(&visitor)), 280 Ok(value) => Ok(value), 281 Err(err) => Err(self.fix_position(err)), 285 pub(crate) fn do_deserialize_i128<'any, V>( 288 ) -> Result<V::Value> 290 V: de::Visitor<'any>, 292 let mut buf = String::new(); 294 match e!(self.parse_whitespace()) { 301 return Err(self.peek_error(ErrorCode::EofWhileParsingValue)); 305 e!(self.scan_integer128(&mut buf)); 307 let value = match buf.parse() { 308 Ok(int) => visitor.visit_i128(int), 310 return Err(self.error(ErrorCode::NumberOutOfRange)); 315 Ok(value) => Ok(value), 316 Err(err) => Err(self.fix_position(err)), 320 pub(crate) fn do_deserialize_u128<'any, V>( 323 ) -> Result<V::Value> 325 V: de::Visitor<'any>, 327 match e!(self.parse_whitespace()) { 329 return Err(self.peek_error(ErrorCode::NumberOutOfRange)); 333 return Err(self.peek_error(ErrorCode::EofWhileParsingValue)); 337 let mut buf = String::new(); 338 e!(self.scan_integer128(&mut buf)); 340 let value = match buf.parse() { 341 Ok(int) => visitor.visit_u128(int), 343 return Err(self.error(ErrorCode::NumberOutOfRange)); 348 Ok(value) => Ok(value), 349 Err(err) => Err(self.fix_position(err)), 353 fn scan_integer128(&mut self, buf: &mut String) -> Result<()> { 354 match e!(self.next_char_or_null()) { 357 // There can be only one leading '0'. 358 match e!(self.peek_or_null()) { 359 b'0'..=b'9' => Err(self.peek_error(ErrorCode::InvalidNumber)), 365 while let c @ b'0'..=b'9' = e!(self.peek_or_null()) { 371 _ => Err(self.error(ErrorCode::InvalidNumber)), 376 fn fix_position(&self, err: Error) -> Error { 377 err.fix_position(move |code| self.error(code)) 380 fn parse_ident(&mut self, ident: &[u8]) -> Result<()> { 381 for expected in ident { 382 match e!(self.next_char()) { 384 return Err(self.error(ErrorCode::EofWhileParsingValue)); 387 if next != *expected { 388 return Err(self.error(ErrorCode::ExpectedSomeSymbol)); 397 fn parse_integer(&mut self, positive: bool) -> Result<ParserNumber> { 398 let next = match e!(self.next_char()) { 401 return Err(self.error(ErrorCode::EofWhileParsingValue)); 407 // There can be only one leading '0'. 408 match e!(self.peek_or_null()) { 409 b'0'..=b'9' => Err(self.peek_error(ErrorCode::InvalidNumber)), 410 _ => self.parse_number(positive, 0), 414 let mut significand = (c - b'0') as u64; 417 match e!(self.peek_or_null()) { 419 let digit = (c - b'0') as u64; 421 // We need to be careful with overflow. If we can, 422 // try to keep the number as a `u64` until we grow 423 // too large. At that point, switch to parsing the 425 if overflow!(significand * 10 + digit, u64::max_value()) { 426 return Ok(ParserNumber::F64(e!( 427 self.parse_long_integer(positive, significand), 432 significand = significand * 10 + digit; 435 return self.parse_number(positive, significand); 440 _ => Err(self.error(ErrorCode::InvalidNumber)), 448 ) -> Result<ParserNumber> { 449 Ok(match e!(self.peek_or_null()) { 451 ParserNumber::F64(e!(self.parse_decimal(positive, significand, 0))) 454 ParserNumber::F64(e!(self.parse_exponent(positive, significand, 0))) 458 ParserNumber::U64(significand) 460 let neg = (significand as i64).wrapping_neg(); 462 // Convert into a float if we underflow, or on `-0`. 464 ParserNumber::F64(-(significand as f64)) 466 ParserNumber::I64(neg) 476 mut significand: u64, 477 exponent_before_decimal_point: i32, 481 let mut exponent_after_decimal_point = 0; 482 while let c @ b'0'..=b'9' = e!(self.peek_or_null()) { 483 let digit = (c - b'0') as u64; 485 if overflow!(significand * 10 + digit, u64::max_value()) { 487 exponent_before_decimal_point + exponent_after_decimal_point; 488 return self.parse_decimal_overflow(positive, significand, exponent); 492 significand = significand * 10 + digit; 493 exponent_after_decimal_point -= 1; 496 // Error if there is not at least one digit after the decimal point. 497 if exponent_after_decimal_point == 0 { 498 match e!(self.peek()) { 499 Some(_) => return Err(self.peek_error(ErrorCode::InvalidNumber)), 500 None => return Err(self.peek_error(ErrorCode::EofWhileParsingValue)), 504 let exponent = exponent_before_decimal_point + exponent_after_decimal_point; 505 match e!(self.peek_or_null()) { 506 b'e' | b'E' => self.parse_exponent(positive, significand, exponent), 507 _ => self.f64_from_parts(positive, significand, exponent), 519 let positive_exp = match e!(self.peek_or_null()) { 531 let next = match e!(self.next_char()) { 534 return Err(self.error(ErrorCode::EofWhileParsingValue)); 538 // Make sure a digit follows the exponent place. 539 let mut exp = match next { 540 c @ b'0'..=b'9' => (c - b'0') as i32, 542 return Err(self.error(ErrorCode::InvalidNumber)); 546 while let c @ b'0'..=b'9' = e!(self.peek_or_null()) { 548 let digit = (c - b'0') as i32; 550 if overflow!(exp * 10 + digit, i32::max_value()) { 551 let zero_significand = significand == 0; 552 return self.parse_exponent_overflow( 559 exp = exp * 10 + digit; 562 let final_exp = if positive_exp { 563 starting_exp.saturating_add(exp) 565 starting_exp.saturating_sub(exp) 568 self.f64_from_parts(positive, significand, final_exp) 577 let mut f = significand as f64; 579 match POW10.get(exponent.wrapping_abs() as usize) { 584 return Err(self.error(ErrorCode::NumberOutOfRange)); 596 return Err(self.error(ErrorCode::NumberOutOfRange)); 603 Ok(if positive { f } else { -f }) 608 fn parse_long_integer( 613 let mut exponent = 0; 615 match e!(self.peek_or_null()) { 618 // This could overflow... if your integer is gigabytes long. 619 // Ignore that possibility. 623 return self.parse_decimal(positive, significand, exponent); 626 return self.parse_exponent(positive, significand, exponent); 629 return self.f64_from_parts(positive, significand, exponent); 637 fn parse_decimal_overflow( 643 // The next multiply/add would overflow, so just ignore all further 645 while let b'0'..=b'9' = e!(self.peek_or_null()) { 649 match e!(self.peek_or_null()) { 650 b'e' | b'E' => self.parse_exponent(positive, significand, exponent), 651 _ => self.f64_from_parts(positive, significand, exponent), 655 // This cold code should not be inlined into the middle of the hot 656 // exponent-parsing loop above. 659 fn parse_exponent_overflow( 662 zero_significand: bool, 665 // Error instead of +/- infinity. 666 if !zero_significand && positive_exp { 667 return Err(self.error(ErrorCode::NumberOutOfRange)); 670 while let b'0'..=b'9' = e!(self.peek_or_null()) { 673 Ok(if positive { 0.0 } else { -0.0 }) 676 fn parse_any_signed_number(&mut self) -> Result<ParserNumber> { 677 let peek = match e!(self.peek()) { 680 return Err(self.peek_error(ErrorCode::EofWhileParsingValue)); 684 let value = match peek { 687 self.parse_any_number(false) 689 b'0'..=b'9' => self.parse_any_number(true), 690 _ => Err(self.peek_error(ErrorCode::InvalidNumber)), 693 let value = match e!(self.peek()) { 694 Some(_) => Err(self.peek_error(ErrorCode::InvalidNumber)), 699 Ok(value) => Ok(value), 700 // The de::Error impl creates errors with unknown line and column. 701 // Fill in the position here by looking at the current index in the 702 // input. There is no way to tell whether this should call `error` 703 // or `peek_error` so pick the one that seems correct more often. 704 // Worst case, the position is off by one character. 705 Err(err) => Err(self.fix_position(err)), 709 fn parse_any_number(&mut self, positive: bool) -> Result<ParserNumber> { 710 self.parse_integer(positive) 713 fn end_seq(&mut self) -> Result<()> { 714 match e!(self.parse_whitespace()) { 721 match self.parse_whitespace() { 722 _ => Err(self.peek_error(ErrorCode::TrailingCharacters)), 725 None => Err(self.peek_error(ErrorCode::EofWhileParsingList)), 729 fn end_map(&mut self) -> Result<()> { 730 match e!(self.parse_whitespace()) { 735 Some(_) => Err(self.peek_error(ErrorCode::TrailingCharacters)), 736 None => Err(self.peek_error(ErrorCode::EofWhileParsingObject)), 740 fn ignore_value(&mut self) -> Result<()> { 741 self.scratch.clear(); 742 let mut enclosing = None; 745 let peek = match e!(self.parse_whitespace()) { 748 return Err(self.peek_error(ErrorCode::EofWhileParsingValue)); 752 let frame = match peek { 755 e!(self.parse_ident(b"il")); 761 e!(self.parse_ident(b"rue")); 766 e!(self.parse_ident(b"alse")); 771 e!(self.ignore_integer()); 775 e!(self.ignore_integer()); 780 e!(self.read.ignore_str()); 784 self.scratch.extend(enclosing.take()); 788 _ => return Err(self.peek_error(ErrorCode::ExpectedSomeValue)), 791 let mut frame = match frame { 792 Some(frame) => frame, 793 None => match enclosing.take() { 794 Some(frame) => frame, 795 None => match self.scratch.pop() { 796 Some(frame) => frame, 797 None => return Ok(()), 803 match e!(self.parse_whitespace()) { 804 Some(b')') if frame == b'(' => {} 809 return Err(self.peek_error(match frame { 810 b'(' => ErrorCode::EofWhileParsingList, 817 frame = match self.scratch.pop() { 818 Some(frame) => frame, 819 None => return Ok(()), 824 match e!(self.parse_whitespace()) { 825 Some(b'"') => self.eat_char(), 826 Some(_) => return Err(self.peek_error(ErrorCode::KeyMustBeASymbol)), 828 return Err(self.peek_error(ErrorCode::EofWhileParsingObject)) 831 e!(self.read.ignore_str()); 832 match e!(self.parse_whitespace()) { 833 Some(b':') => self.eat_char(), 835 return Err(self.peek_error(ErrorCode::EofWhileParsingObject)) 838 return Err(self.peek_error(ErrorCode::EofWhileParsingObject)) 843 enclosing = Some(frame); 847 fn ignore_integer(&mut self) -> Result<()> { 848 match e!(self.next_char_or_null()) { 850 // There can be only one leading '0'. 851 if let b'0'..=b'9' = e!(self.peek_or_null()) { 852 return Err(self.peek_error(ErrorCode::InvalidNumber)); 856 while let b'0'..=b'9' = e!(self.peek_or_null()) { 861 return Err(self.error(ErrorCode::InvalidNumber)); 865 match e!(self.peek_or_null()) { 866 b'.' => self.ignore_decimal(), 867 b'e' | b'E' => self.ignore_exponent(), 872 fn ignore_decimal(&mut self) -> Result<()> { 875 let mut at_least_one_digit = false; 876 while let b'0'..=b'9' = e!(self.peek_or_null()) { 878 at_least_one_digit = true; 881 if !at_least_one_digit { 882 return Err(self.peek_error(ErrorCode::InvalidNumber)); 885 match e!(self.peek_or_null()) { 886 b'e' | b'E' => self.ignore_exponent(), 891 fn ignore_exponent(&mut self) -> Result<()> { 894 match e!(self.peek_or_null()) { 895 b'+' | b'-' => self.eat_char(), 899 // Make sure a digit follows the exponent place. 900 match e!(self.next_char_or_null()) { 903 return Err(self.error(ErrorCode::InvalidNumber)); 907 while let b'0'..=b'9' = e!(self.peek_or_null()) { 915 #[cfg(not(feature = "float_roundtrip"))] 916 static POW10: [f64; 309] = [ 917 1e000, 1e001, 1e002, 1e003, 1e004, 1e005, 1e006, 1e007, 1e008, 1e009, // 918 1e010, 1e011, 1e012, 1e013, 1e014, 1e015, 1e016, 1e017, 1e018, 1e019, // 919 1e020, 1e021, 1e022, 1e023, 1e024, 1e025, 1e026, 1e027, 1e028, 1e029, // 920 1e030, 1e031, 1e032, 1e033, 1e034, 1e035, 1e036, 1e037, 1e038, 1e039, // 921 1e040, 1e041, 1e042, 1e043, 1e044, 1e045, 1e046, 1e047, 1e048, 1e049, // 922 1e050, 1e051, 1e052, 1e053, 1e054, 1e055, 1e056, 1e057, 1e058, 1e059, // 923 1e060, 1e061, 1e062, 1e063, 1e064, 1e065, 1e066, 1e067, 1e068, 1e069, // 924 1e070, 1e071, 1e072, 1e073, 1e074, 1e075, 1e076, 1e077, 1e078, 1e079, // 925 1e080, 1e081, 1e082, 1e083, 1e084, 1e085, 1e086, 1e087, 1e088, 1e089, // 926 1e090, 1e091, 1e092, 1e093, 1e094, 1e095, 1e096, 1e097, 1e098, 1e099, // 927 1e100, 1e101, 1e102, 1e103, 1e104, 1e105, 1e106, 1e107, 1e108, 1e109, // 928 1e110, 1e111, 1e112, 1e113, 1e114, 1e115, 1e116, 1e117, 1e118, 1e119, // 929 1e120, 1e121, 1e122, 1e123, 1e124, 1e125, 1e126, 1e127, 1e128, 1e129, // 930 1e130, 1e131, 1e132, 1e133, 1e134, 1e135, 1e136, 1e137, 1e138, 1e139, // 931 1e140, 1e141, 1e142, 1e143, 1e144, 1e145, 1e146, 1e147, 1e148, 1e149, // 932 1e150, 1e151, 1e152, 1e153, 1e154, 1e155, 1e156, 1e157, 1e158, 1e159, // 933 1e160, 1e161, 1e162, 1e163, 1e164, 1e165, 1e166, 1e167, 1e168, 1e169, // 934 1e170, 1e171, 1e172, 1e173, 1e174, 1e175, 1e176, 1e177, 1e178, 1e179, // 935 1e180, 1e181, 1e182, 1e183, 1e184, 1e185, 1e186, 1e187, 1e188, 1e189, // 936 1e190, 1e191, 1e192, 1e193, 1e194, 1e195, 1e196, 1e197, 1e198, 1e199, // 937 1e200, 1e201, 1e202, 1e203, 1e204, 1e205, 1e206, 1e207, 1e208, 1e209, // 938 1e210, 1e211, 1e212, 1e213, 1e214, 1e215, 1e216, 1e217, 1e218, 1e219, // 939 1e220, 1e221, 1e222, 1e223, 1e224, 1e225, 1e226, 1e227, 1e228, 1e229, // 940 1e230, 1e231, 1e232, 1e233, 1e234, 1e235, 1e236, 1e237, 1e238, 1e239, // 941 1e240, 1e241, 1e242, 1e243, 1e244, 1e245, 1e246, 1e247, 1e248, 1e249, // 942 1e250, 1e251, 1e252, 1e253, 1e254, 1e255, 1e256, 1e257, 1e258, 1e259, // 943 1e260, 1e261, 1e262, 1e263, 1e264, 1e265, 1e266, 1e267, 1e268, 1e269, // 944 1e270, 1e271, 1e272, 1e273, 1e274, 1e275, 1e276, 1e277, 1e278, 1e279, // 945 1e280, 1e281, 1e282, 1e283, 1e284, 1e285, 1e286, 1e287, 1e288, 1e289, // 946 1e290, 1e291, 1e292, 1e293, 1e294, 1e295, 1e296, 1e297, 1e298, 1e299, // 947 1e300, 1e301, 1e302, 1e303, 1e304, 1e305, 1e306, 1e307, 1e308, 950 macro_rules! deserialize_number { 952 deserialize_number!($method, deserialize_number); 955 ($method:ident, $using:ident) => { 956 fn $method<V>(self, visitor: V) -> Result<V::Value> 965 macro_rules! if_checking_recursion_limit { 971 macro_rules! check_recursion { 972 ($this:ident $($body:tt)*) => { 973 if_checking_recursion_limit! { 975 if $this.depth == 0 { 976 return Err($this.peek_error(ErrorCode::RecursionLimitExceeded)); 982 if_checking_recursion_limit! { 988 impl<'de, 'a, R: Read<'de>, F: ReadFormatter<'de>> de::Deserializer<'de> 989 for &'a mut Deserializer<R, F> 994 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value> 998 let peek = match e!(self.parse_whitespace()) { 1001 return Err(self.peek_error(ErrorCode::EofWhileParsingValue)); 1005 let value = match peek { 1008 e!(self.parse_ident(b"ull")); 1009 visitor.visit_unit() 1013 e!(self.parse_ident(b"rue")); 1014 visitor.visit_bool(true) 1018 e!(self.parse_ident(b"alse")); 1019 visitor.visit_bool(false) 1023 e!(self.parse_any_number(false)).visit(visitor) 1025 b'0'..=b'9' => e!(self.parse_any_number(true)).visit(visitor), 1028 self.scratch.clear(); 1029 match e!(self.read.parse_str(&mut self.scratch)) { 1030 Reference::Borrowed(s) => visitor.visit_borrowed_str(s), 1031 Reference::Copied(s) => visitor.visit_str(s), 1037 let ret = visitor.visit_seq(SeqAccess::new(self)); 1040 match (ret, self.end_seq()) { 1041 (Ok(ret), Ok(())) => Ok(ret), 1042 (Err(err), _) | (_, Err(err)) => Err(err), 1045 _ => Err(self.peek_error(ErrorCode::ExpectedSomeValue)), 1049 Ok(value) => Ok(value), 1050 // The de::Error impl creates errors with unknown line and column. 1051 // Fill in the position here by looking at the current index in the 1052 // input. There is no way to tell whether this should call `error` 1053 // or `peek_error` so pick the one that seems correct more often. 1054 // Worst case, the position is off by one character. 1055 Err(err) => Err(self.fix_position(err)), 1059 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value> 1061 V: de::Visitor<'de>, 1063 let peek = match e!(self.parse_whitespace()) { 1066 return Err(self.peek_error(ErrorCode::EofWhileParsingValue)); 1070 let value = match peek { 1073 e!(self.parse_ident(b"rue")); 1074 visitor.visit_bool(true) 1078 e!(self.parse_ident(b"alse")); 1079 visitor.visit_bool(false) 1081 _ => Err(self.peek_invalid_type(&visitor)), 1085 Ok(value) => Ok(value), 1086 Err(err) => Err(self.fix_position(err)), 1090 deserialize_number!(deserialize_i8); 1091 deserialize_number!(deserialize_i16); 1092 deserialize_number!(deserialize_i32); 1093 deserialize_number!(deserialize_i64); 1094 deserialize_number!(deserialize_u8); 1095 deserialize_number!(deserialize_u16); 1096 deserialize_number!(deserialize_u32); 1097 deserialize_number!(deserialize_u64); 1098 deserialize_number!(deserialize_f32); 1099 deserialize_number!(deserialize_f64); 1101 deserialize_number!(deserialize_i128, do_deserialize_i128); 1102 deserialize_number!(deserialize_u128, do_deserialize_u128); 1104 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value> 1106 V: de::Visitor<'de>, 1108 self.deserialize_str(visitor) 1111 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value> 1113 V: de::Visitor<'de>, 1115 let peek = match e!(self.parse_whitespace()) { 1118 return Err(self.peek_error(ErrorCode::EofWhileParsingValue)); 1122 let value = match peek { 1125 self.scratch.clear(); 1126 match e!(self.read.parse_str(&mut self.scratch)) { 1127 Reference::Borrowed(s) => visitor.visit_borrowed_str(s), 1128 Reference::Copied(s) => visitor.visit_str(s), 1131 _ => Err(self.peek_invalid_type(&visitor)), 1135 Ok(value) => Ok(value), 1136 Err(err) => Err(self.fix_position(err)), 1140 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value> 1142 V: de::Visitor<'de>, 1144 self.deserialize_str(visitor) 1147 /// Parses a SXP string as bytes. Note that this function does not check 1148 /// whether the bytes represent a valid UTF-8 string. 1150 /// The relevant part of the SXP specification is Section 8.2 of [RFC 1153 /// > When all the strings represented in a SXP text are composed entirely 1154 /// > of Unicode characters (however escaped), then that SXP text is 1155 /// > interoperable in the sense that all software implementations that 1156 /// > parse it will agree on the contents of names and of string values in 1157 /// > objects and arrays. 1159 /// > However, the ABNF in this specification allows member names and string 1160 /// > values to contain bit sequences that cannot encode Unicode characters; 1161 /// > for example, "\uDEAD" (a single unpaired UTF-16 surrogate). Instances 1162 /// > of this have been observed, for example, when a library truncates a 1163 /// > UTF-16 string without checking whether the truncation split a 1164 /// > surrogate pair. The behavior of software that receives SXP texts 1165 /// > containing such values is unpredictable; for example, implementations 1166 /// > might return different values for the length of a string value or even 1167 /// > suffer fatal runtime exceptions. 1169 /// [RFC 7159]: https://tools.ietf.org/html/rfc7159 1171 /// The behavior of sxp is specified to fail on non-UTF-8 strings 1172 /// when deserializing into Rust UTF-8 string types such as String, and 1173 /// succeed with non-UTF-8 bytes when deserializing using this method. 1175 /// Escape sequences are processed as usual, and for `\uXXXX` escapes it is 1176 /// still checked if the hex number represents a valid Unicode code point. 1177 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value> 1179 V: de::Visitor<'de>, 1181 let peek = match e!(self.parse_whitespace()) { 1184 return Err(self.peek_error(ErrorCode::EofWhileParsingValue)); 1188 let value = match peek { 1191 self.scratch.clear(); 1192 match e!(self.read.parse_str_raw(&mut self.scratch)) { 1193 Reference::Borrowed(b) => visitor.visit_borrowed_bytes(b), 1194 Reference::Copied(b) => visitor.visit_bytes(b), 1197 b'(' => self.deserialize_seq(visitor), 1198 _ => Err(self.peek_invalid_type(&visitor)), 1202 Ok(value) => Ok(value), 1203 Err(err) => Err(self.fix_position(err)), 1208 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value> 1210 V: de::Visitor<'de>, 1212 self.deserialize_bytes(visitor) 1215 /// Parses a `null` as a None, and any other values as a `Some(...)`. 1217 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value> 1219 V: de::Visitor<'de>, 1221 match e!(self.parse_whitespace()) { 1224 e!(self.parse_ident(b"ull")); 1225 visitor.visit_none() 1227 _ => visitor.visit_some(self), 1231 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value> 1233 V: de::Visitor<'de>, 1235 let peek = match e!(self.parse_whitespace()) { 1238 return Err(self.peek_error(ErrorCode::EofWhileParsingValue)); 1242 let value = match peek { 1245 e!(self.parse_ident(b"il")); 1246 visitor.visit_unit() 1248 _ => Err(self.peek_invalid_type(&visitor)), 1252 Ok(value) => Ok(value), 1253 Err(err) => Err(self.fix_position(err)), 1257 fn deserialize_unit_struct<V>( 1259 _name: &'static str, 1261 ) -> Result<V::Value> 1263 V: de::Visitor<'de>, 1265 self.deserialize_unit(visitor) 1268 /// Parses a newtype struct as the underlying value. 1270 fn deserialize_newtype_struct<V>( 1274 ) -> Result<V::Value> 1276 V: de::Visitor<'de>, 1279 visitor.visit_newtype_struct(self) 1282 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value> 1284 V: de::Visitor<'de>, 1286 let peek = match e!(self.parse_whitespace()) { 1289 return Err(self.peek_error(ErrorCode::EofWhileParsingValue)); 1293 let value = match peek { 1297 let ret = visitor.visit_seq(SeqAccess::new(self)); 1300 match (ret, self.end_seq()) { 1301 (Ok(ret), Ok(())) => Ok(ret), 1302 (Err(err), _) | (_, Err(err)) => Err(err), 1305 _ => Err(self.peek_invalid_type(&visitor)), 1309 Ok(value) => Ok(value), 1310 Err(err) => Err(self.fix_position(err)), 1314 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value> 1316 V: de::Visitor<'de>, 1318 self.deserialize_seq(visitor) 1321 fn deserialize_tuple_struct<V>( 1323 _name: &'static str, 1326 ) -> Result<V::Value> 1328 V: de::Visitor<'de>, 1330 self.deserialize_seq(visitor) 1333 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value> 1335 V: de::Visitor<'de>, 1337 let peek = match e!(self.parse_whitespace()) { 1340 return Err(self.peek_error(ErrorCode::EofWhileParsingValue)); 1344 let value = match peek { 1348 let ret = visitor.visit_map(MapAccess::new(self)); 1351 match (ret, self.end_map()) { 1352 (Ok(ret), Ok(())) => Ok(ret), 1353 (Err(err), _) | (_, Err(err)) => Err(err), 1356 _ => Err(self.peek_invalid_type(&visitor)), 1360 Ok(value) => Ok(value), 1361 Err(err) => Err(self.fix_position(err)), 1365 fn deserialize_struct<V>( 1367 _name: &'static str, 1368 _fields: &'static [&'static str], 1370 ) -> Result<V::Value> 1372 V: de::Visitor<'de>, 1374 let peek = match e!(self.parse_whitespace()) { 1377 return Err(self.peek_error(ErrorCode::EofWhileParsingValue)); 1381 let value = match peek { 1385 let ret = visitor.visit_seq(SeqAccess::new(self)); 1388 match (ret, self.end_seq()) { 1389 (Ok(ret), Ok(())) => Ok(ret), 1390 (Err(err), _) | (_, Err(err)) => Err(err), 1393 _ => Err(self.peek_invalid_type(&visitor)), 1397 Ok(value) => Ok(value), 1398 Err(err) => Err(self.fix_position(err)), 1402 /// Parses an enum as an object like `{"$KEY":$VALUE}`, where $VALUE is either 1403 /// a straight value, a `[..]`, or a `{..}`. 1405 fn deserialize_enum<V>( 1408 _variants: &'static [&'static str], 1410 ) -> Result<V::Value> 1412 V: de::Visitor<'de>, 1414 match e!(self.parse_whitespace()) { 1418 let value = e!(visitor.visit_enum(VariantAccess::new(self))); 1421 match e!(self.parse_whitespace()) { 1426 Some(_) => Err(self.error(ErrorCode::ExpectedSomeValue)), 1427 None => Err(self.error(ErrorCode::EofWhileParsingObject)), 1430 Some(b'"') => visitor.visit_enum(UnitVariantAccess::new(self)), 1431 Some(_) => visitor.visit_enum(UnitVariantAccess::new(self)), 1432 None => Err(self.peek_error(ErrorCode::EofWhileParsingValue)), 1436 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value> 1438 V: de::Visitor<'de>, 1440 self.deserialize_str(visitor) 1443 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value> 1445 V: de::Visitor<'de>, 1447 e!(self.ignore_value()); 1448 visitor.visit_unit() 1452 struct SeqAccess<'a, R: 'a, F: 'a> { 1453 de: &'a mut Deserializer<R, F>, 1457 impl<'a, R: 'a, F: 'a> SeqAccess<'a, R, F> { 1458 fn new(de: &'a mut Deserializer<R, F>) -> Self { 1459 SeqAccess { de, first: true } 1463 impl<'de, 'a, R: Read<'de> + 'a, F: ReadFormatter<'de> + 'a> de::SeqAccess<'de> 1464 for SeqAccess<'a, R, F> 1468 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>> 1470 T: de::DeserializeSeed<'de>, 1472 let peek = match e!(self.de.parse_whitespace()) { 1483 return Err(self.de.peek_error(ErrorCode::EofWhileParsingList)); 1488 Some(_) => Ok(Some(e!(seed.deserialize(&mut *self.de)))), 1489 None => Err(self.de.peek_error(ErrorCode::EofWhileParsingValue)), 1494 struct MapAccess<'a, R: 'a, F> { 1495 de: &'a mut Deserializer<R, F>, 1499 impl<'a, R: 'a, F> MapAccess<'a, R, F> { 1500 fn new(de: &'a mut Deserializer<R, F>) -> Self { 1501 MapAccess { de, first: true } 1505 impl<'de, 'a, R: Read<'de> + 'a, F: for<'r> ReadFormatter<'r>> de::MapAccess<'de> 1506 for MapAccess<'a, R, F> 1510 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>> 1512 K: de::DeserializeSeed<'de>, 1514 let peek = match e!(self.de.parse_whitespace()) { 1525 return Err(self.de.peek_error(ErrorCode::EofWhileParsingObject)); 1530 Some(b'"') => seed.deserialize(MapKey { de: &mut *self.de }).map(Some), 1531 Some(b')') => Err(self.de.peek_error(ErrorCode::TrailingCharacters)), 1532 Some(_) => Err(self.de.peek_error(ErrorCode::KeyMustBeASymbol)), 1533 None => Err(self.de.peek_error(ErrorCode::EofWhileParsingValue)), 1537 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value> 1539 V: de::DeserializeSeed<'de>, 1541 e!(self.de.parse_whitespace()); 1542 seed.deserialize(&mut *self.de) 1546 struct VariantAccess<'a, R: 'a, F: 'a> { 1547 de: &'a mut Deserializer<R, F>, 1550 impl<'a, R: 'a, F: 'a> VariantAccess<'a, R, F> { 1551 fn new(de: &'a mut Deserializer<R, F>) -> Self { 1552 VariantAccess { de } 1556 impl<'de, 'a, R: Read<'de> + 'a, F: ReadFormatter<'de> + 'a> de::EnumAccess<'de> 1557 for VariantAccess<'a, R, F> 1560 type Variant = Self; 1562 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self)> 1564 V: de::DeserializeSeed<'de>, 1566 let val = e!(seed.deserialize(&mut *self.de)); 1567 e!(self.de.parse_whitespace()); 1572 impl<'de, 'a, R: Read<'de> + 'a, F: ReadFormatter<'de> + 'a> de::VariantAccess<'de> 1573 for VariantAccess<'a, R, F> 1577 fn unit_variant(self) -> Result<()> { 1578 de::Deserialize::deserialize(self.de) 1581 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value> 1583 T: de::DeserializeSeed<'de>, 1585 seed.deserialize(self.de) 1588 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value> 1590 V: de::Visitor<'de>, 1592 de::Deserializer::deserialize_seq(self.de, visitor) 1595 fn struct_variant<V>( 1597 fields: &'static [&'static str], 1599 ) -> Result<V::Value> 1601 V: de::Visitor<'de>, 1603 de::Deserializer::deserialize_struct(self.de, "", fields, visitor) 1607 struct UnitVariantAccess<'a, R: 'a, F: 'a> { 1608 de: &'a mut Deserializer<R, F>, 1611 impl<'a, R: 'a, F: 'a> UnitVariantAccess<'a, R, F> { 1612 fn new(de: &'a mut Deserializer<R, F>) -> Self { 1613 UnitVariantAccess { de } 1617 impl<'de, 'a, R: Read<'de> + 'a, F: ReadFormatter<'de> + 'a> de::EnumAccess<'de> 1618 for UnitVariantAccess<'a, R, F> 1621 type Variant = Self; 1623 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self)> 1625 V: de::DeserializeSeed<'de>, 1627 let variant = e!(seed.deserialize(&mut *self.de)); 1632 impl<'de, 'a, R: Read<'de> + 'a, F: ReadFormatter<'de> + 'a> de::VariantAccess<'de> 1633 for UnitVariantAccess<'a, R, F> 1637 fn unit_variant(self) -> Result<()> { 1641 fn newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value> 1643 T: de::DeserializeSeed<'de>, 1645 Err(de::Error::invalid_type( 1646 Unexpected::UnitVariant, 1651 fn tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value> 1653 V: de::Visitor<'de>, 1655 Err(de::Error::invalid_type( 1656 Unexpected::UnitVariant, 1661 fn struct_variant<V>( 1663 _fields: &'static [&'static str], 1665 ) -> Result<V::Value> 1667 V: de::Visitor<'de>, 1669 Err(de::Error::invalid_type( 1670 Unexpected::UnitVariant, 1676 /// Only deserialize from this after peeking a '"' byte! Otherwise it may 1677 /// deserialize invalid SXP successfully. 1678 struct MapKey<'a, R: 'a, F: ReadFormatter<'a>> { 1679 de: &'a mut Deserializer<R, F>, 1682 macro_rules! deserialize_numeric_key { 1683 ($method:ident) => { 1684 fn $method<V>(self, visitor: V) -> Result<V::Value> 1686 V: de::Visitor<'de>, 1688 self.deserialize_number(visitor) 1692 ($method:ident, $delegate:ident) => { 1693 fn $method<V>(self, visitor: V) -> Result<V::Value> 1695 V: de::Visitor<'de>, 1699 match e!(self.de.peek()) { 1700 Some(b'0'..=b'9' | b'-') => {} 1701 _ => return Err(self.de.error(ErrorCode::InvalidNumber)), 1704 let value = e!(self.de.$delegate(visitor)); 1706 match e!(self.de.peek()) { 1707 Some(b'"') => self.de.eat_char(), 1708 _ => return Err(self.de.peek_error(ErrorCode::ExpectedDoubleQuote)), 1716 impl<'de, 'a, R, F> MapKey<'a, R, F> 1719 F: ReadFormatter<'a>, 1721 deserialize_numeric_key!(deserialize_number, deserialize_number); 1724 impl<'de, 'a, R, F: ReadFormatter<'a>> de::Deserializer<'de> for MapKey<'a, R, F> 1731 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value> 1733 V: de::Visitor<'de>, 1736 self.de.scratch.clear(); 1737 match e!(self.de.read.parse_str(&mut self.de.scratch)) { 1738 Reference::Borrowed(s) => visitor.visit_borrowed_str(s), 1739 Reference::Copied(s) => visitor.visit_str(s), 1743 deserialize_numeric_key!(deserialize_i8); 1744 deserialize_numeric_key!(deserialize_i16); 1745 deserialize_numeric_key!(deserialize_i32); 1746 deserialize_numeric_key!(deserialize_i64); 1747 deserialize_numeric_key!(deserialize_i128, deserialize_i128); 1748 deserialize_numeric_key!(deserialize_u8); 1749 deserialize_numeric_key!(deserialize_u16); 1750 deserialize_numeric_key!(deserialize_u32); 1751 deserialize_numeric_key!(deserialize_u64); 1752 deserialize_numeric_key!(deserialize_u128, deserialize_u128); 1753 deserialize_numeric_key!(deserialize_f32); 1754 deserialize_numeric_key!(deserialize_f64); 1757 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value> 1759 V: de::Visitor<'de>, 1761 // Map keys cannot be null. 1762 visitor.visit_some(self) 1766 fn deserialize_newtype_struct<V>( 1770 ) -> Result<V::Value> 1772 V: de::Visitor<'de>, 1775 visitor.visit_newtype_struct(self) 1779 fn deserialize_enum<V>( 1782 variants: &'static [&'static str], 1784 ) -> Result<V::Value> 1786 V: de::Visitor<'de>, 1788 self.de.deserialize_enum(name, variants, visitor) 1792 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value> 1794 V: de::Visitor<'de>, 1796 self.de.deserialize_bytes(visitor) 1800 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value> 1802 V: de::Visitor<'de>, 1804 self.de.deserialize_bytes(visitor) 1807 forward_to_deserialize_any! { 1808 bool char str string unit unit_struct seq tuple tuple_struct map struct 1809 identifier ignored_any 1813 ////////////////////////////////////////////////////////////////////////////// 1815 /// Iterator that deserializes a stream into multiple SXP values. 1817 /// A stream deserializer can be created from any SXP deserializer using the 1818 /// `Deserializer::into_iter` method. 1820 /// The data can consist of any SXP value. Values need to be a self-delineating 1821 /// value e.g. arrays, objects, or strings, or be followed by whitespace or a 1822 /// self-delineating value. 1823 pub struct StreamDeserializer<'de, R, F: ReadFormatter<'de>, T> { 1824 de: Deserializer<R, F>, 1827 output: PhantomData<T>, 1828 lifetime: PhantomData<&'de ()>, 1831 impl<'de, R, F, T> StreamDeserializer<'de, R, F, T> 1834 T: de::Deserialize<'de>, 1835 F: ReadFormatter<'de>, 1837 /// Create a SXP stream deserializer from one of the possible sxp 1840 /// Typically it is more convenient to use one of these methods instead: 1842 /// - Deserializer::from_str(...).into_iter() 1843 /// - Deserializer::from_slice(...).into_iter() 1844 /// - Deserializer::from_reader(...).into_iter() 1845 pub fn new(read: R, fmt: F) -> Self { 1846 let offset = read.byte_offset(); 1847 StreamDeserializer { 1848 de: Deserializer::new(read, fmt), 1851 output: PhantomData, 1852 lifetime: PhantomData, 1856 /// Returns the number of bytes so far deserialized into a successful `T`. 1857 pub fn byte_offset(&self) -> usize { 1861 fn peek_end_of_value(&mut self) -> Result<()> { 1862 match e!(self.de.peek()) { 1864 b' ' | b'\n' | b'\t' | b'\r' | b'"' | b'(' | b')' | b',' // TODO 1869 let position = self.de.read.peek_position(); 1871 ErrorCode::TrailingCharacters, 1880 impl<'de, R, F, T> Iterator for StreamDeserializer<'de, R, F, T> 1883 T: de::Deserialize<'de>, 1884 F: ReadFormatter<'de>, 1886 type Item = Result<T>; 1888 fn next(&mut self) -> Option<Result<T>> { 1889 if R::should_early_return_if_failed && self.failed { 1893 // skip whitespaces, if any 1894 // this helps with trailing whitespaces, since whitespaces between 1895 // values are handled for us. 1896 match self.de.parse_whitespace() { 1898 self.offset = self.de.read.byte_offset(); 1902 // If the value does not have a clear way to show the end of the value 1903 // (like numbers, null, true etc.) we have to look for whitespace or 1904 // the beginning of a self-delineated value. 1905 let self_delineated_value = match b { 1906 b'"' | b'(' => true, 1909 self.offset = self.de.read.byte_offset(); 1910 let result = de::Deserialize::deserialize(&mut self.de); 1914 self.offset = self.de.read.byte_offset(); 1915 if self_delineated_value { 1918 self.peek_end_of_value().map(|_| value) 1922 self.de.read.set_failed(&mut self.failed); 1928 self.de.read.set_failed(&mut self.failed); 1935 impl<'de, R, F, T> FusedIterator for StreamDeserializer<'de, R, F, T> 1937 R: Read<'de> + Fused, 1938 T: de::Deserialize<'de>, 1939 F: ReadFormatter<'de>, 1943 pub fn from_traits<'de, R: Read<'de>, F: ReadFormatter<'de>, T: de::Deserialize<'de>>( 1947 let mut de = Deserializer::new(r, f); 1948 let value = e!(de::Deserialize::deserialize(&mut de)); 1950 // Make sure the whole stream has been consumed. 1955 pub fn from_reader<'de, R: crate::io::Read, T: de::DeserializeOwned>( 1958 from_traits(read::IoRead::new(rdr), DefaultFormatter) 1961 pub fn from_str<'de, T: de::Deserialize<'de>>(v: &'de str) -> Result<T> { 1962 from_traits(read::StrRead::new(v), DefaultFormatter) 1965 pub fn from_slice<'de, T: Deserialize<'de>>(v: &'de [u8]) -> Result<T> { 1966 from_traits(read::SliceRead::new(v), DefaultFormatter)