changelog shortlog graph tags branches changeset files revisions annotate raw help

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};
3 use crate::{
4  err::ErrorCode,
5  fmt::{DefaultFormatter, ReadFormatter},
6  Error, Result,
7 };
8 use alloc::string::String;
9 use alloc::vec::Vec;
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;
14 
15 pub use crate::read::{Read, SliceRead, StrRead};
16 
17 #[cfg(feature = "std")]
18 pub use crate::read::IoRead;
19 
20 pub struct Deserializer<R,F> {
21  read: R,
22  scratch: Vec<u8>,
23  formatter: F,
24  depth: u8,
25  unbound: bool,
26 }
27 
28 impl<'de, R: Read<'de>, F: ReadFormatter<'de>> Deserializer<R, F> {
29  pub fn new(read: R, formatter: F) -> Self {
30  Deserializer {
31  read,
32  scratch: Vec::new(),
33  formatter,
34  depth: 128,
35  unbound: true,
36  }
37  }
38 }
39 
40 #[cfg(feature = "std")]
41 impl<'de, R: Read<'de> + std::io::Read>
42  Deserializer<read::IoRead<R>, DefaultFormatter>
43 {
44  /// Creates a SXP deserializer from an `io::Read`.
45  ///
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)
52  }
53 }
54 
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)
59  }
60 }
61 
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)
66  }
67 }
68 
69 macro_rules! overflow {
70  ($a:ident * 10 + $b:ident, $c:expr) => {
71  match $c {
72  c => $a >= c / 10 && ($a > c / 10 || $b > c % 10),
73  }
74  };
75 }
76 
77 pub(crate) enum ParserNumber {
78  F64(f64),
79  U64(u64),
80  I64(i64),
81 }
82 
83 impl ParserNumber {
84  fn visit<'de, V>(self, visitor: V) -> Result<V::Value>
85  where
86  V: de::Visitor<'de>,
87  {
88  match self {
89  ParserNumber::F64(x) => visitor.visit_f64(x),
90  ParserNumber::U64(x) => visitor.visit_u64(x),
91  ParserNumber::I64(x) => visitor.visit_i64(x),
92  }
93  }
94 
95  fn invalid_type(self, exp: &dyn Expected) -> Error {
96  match self {
97  ParserNumber::F64(x) => {
98  de::Error::invalid_type(Unexpected::Float(x), exp)
99  }
100  ParserNumber::U64(x) => {
101  de::Error::invalid_type(Unexpected::Unsigned(x), exp)
102  }
103  ParserNumber::I64(x) => {
104  de::Error::invalid_type(Unexpected::Signed(x), exp)
105  }
106  }
107  }
108 }
109 
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)),
117  None => Ok(()),
118  }
119  }
120 
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>
123  where
124  T: de::Deserialize<'de>,
125  {
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();
129  StreamDeserializer {
130  de: self,
131  offset,
132  failed: false,
133  output: PhantomData,
134  lifetime: PhantomData,
135  }
136  }
137 
138  #[cfg(feature = "unbound")]
139  /// Parse arbitrarily deep SXP structures without any consideration for
140  /// overflowing the stack.
141  ///
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
148  /// impls.
149  ///
150  /// *This method is only available if sxp is built with the
151  /// `"unbound"` feature.*
152  pub fn disable_recursion_limit(&mut self) {
153  self.unbound = true;
154  }
155 
156  pub(crate) fn peek(&mut self) -> Result<Option<u8>> {
157  self.read.peek()
158  }
159 
160  fn peek_or_null(&mut self) -> Result<u8> {
161  Ok(e!(self.peek()).unwrap_or(b'\x00'))
162  }
163 
164  fn eat_char(&mut self) {
165  self.read.discard();
166  }
167 
168  fn next_char(&mut self) -> Result<Option<u8>> {
169  self.read.next()
170  }
171 
172  fn next_char_or_null(&mut self) -> Result<u8> {
173  Ok(e!(self.next_char()).unwrap_or(b'\x00'))
174  }
175 
176  /// Error caused by a byte from next_char().
177  #[cold]
178  fn error(&self, reason: ErrorCode) -> Error {
179  let position = self.read.position();
180  Error::syntax(reason, position.line, position.column)
181  }
182 
183  /// Error caused by a byte from peek().
184  #[cold]
185  fn peek_error(&self, reason: ErrorCode) -> Error {
186  let position = self.read.peek_position();
187  Error::syntax(reason, position.line, position.column)
188  }
189 
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>> {
193  loop {
194  match e!(self.peek()) {
195  Some(b' ' | b'\n' | b'\t' | b'\r') => {
196  self.eat_char();
197  }
198  other => {
199  return Ok(other);
200  }
201  }
202  }
203  }
204 
205  #[cold]
206  fn peek_invalid_type(&mut self, exp: &dyn Expected) -> Error {
207  let err = match self.peek_or_null().unwrap_or(b'\x00') {
208  b'n' => {
209  self.eat_char();
210  if let Err(err) = self.parse_ident(b"il") {
211  return err;
212  }
213  de::Error::invalid_type(Unexpected::Unit, exp)
214  }
215  // TODO 2023-07-14 : use read-symbol
216  b't' => {
217  self.eat_char();
218  if let Err(err) = self.parse_ident(b"rue") {
219  return err;
220  }
221  de::Error::invalid_type(Unexpected::Bool(true), exp)
222  }
223  b'f' => {
224  self.eat_char();
225  if let Err(err) = self.parse_ident(b"") {
226  return err;
227  }
228  de::Error::invalid_type(Unexpected::Bool(false), exp)
229  }
230  b'-' => {
231  self.eat_char();
232  match self.parse_any_number(false) {
233  Ok(n) => n.invalid_type(exp),
234  Err(err) => return err,
235  }
236  }
237  b'0'..=b'9' => match self.parse_any_number(true) {
238  Ok(n) => n.invalid_type(exp),
239  Err(err) => return err,
240  },
241  b'"' => {
242  self.eat_char();
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,
247  }
248  }
249  b'(' => de::Error::invalid_type(Unexpected::Seq, exp),
250  _ => self.peek_error(ErrorCode::ExpectedSomeValue),
251  };
252 
253  self.fix_position(err)
254  }
255 
256  pub(crate) fn deserialize_number<'any, V>(
257  &mut self,
258  visitor: V,
259  ) -> Result<V::Value>
260  where
261  V: de::Visitor<'any>,
262  {
263  let peek = match e!(self.parse_whitespace()) {
264  Some(b) => b,
265  None => {
266  return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
267  }
268  };
269 
270  let value = match peek {
271  b'-' => {
272  self.eat_char();
273  e!(self.parse_integer(false)).visit(visitor)
274  }
275  b'0'..=b'9' => e!(self.parse_integer(true)).visit(visitor),
276  _ => Err(self.peek_invalid_type(&visitor)),
277  };
278 
279  match value {
280  Ok(value) => Ok(value),
281  Err(err) => Err(self.fix_position(err)),
282  }
283  }
284 
285  pub(crate) fn do_deserialize_i128<'any, V>(
286  &mut self,
287  visitor: V,
288  ) -> Result<V::Value>
289  where
290  V: de::Visitor<'any>,
291  {
292  let mut buf = String::new();
293 
294  match e!(self.parse_whitespace()) {
295  Some(b'-') => {
296  self.eat_char();
297  buf.push('-');
298  }
299  Some(_) => {}
300  None => {
301  return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
302  }
303  };
304 
305  e!(self.scan_integer128(&mut buf));
306 
307  let value = match buf.parse() {
308  Ok(int) => visitor.visit_i128(int),
309  Err(_) => {
310  return Err(self.error(ErrorCode::NumberOutOfRange));
311  }
312  };
313 
314  match value {
315  Ok(value) => Ok(value),
316  Err(err) => Err(self.fix_position(err)),
317  }
318  }
319 
320  pub(crate) fn do_deserialize_u128<'any, V>(
321  &mut self,
322  visitor: V,
323  ) -> Result<V::Value>
324  where
325  V: de::Visitor<'any>,
326  {
327  match e!(self.parse_whitespace()) {
328  Some(b'-') => {
329  return Err(self.peek_error(ErrorCode::NumberOutOfRange));
330  }
331  Some(_) => {}
332  None => {
333  return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
334  }
335  }
336 
337  let mut buf = String::new();
338  e!(self.scan_integer128(&mut buf));
339 
340  let value = match buf.parse() {
341  Ok(int) => visitor.visit_u128(int),
342  Err(_) => {
343  return Err(self.error(ErrorCode::NumberOutOfRange));
344  }
345  };
346 
347  match value {
348  Ok(value) => Ok(value),
349  Err(err) => Err(self.fix_position(err)),
350  }
351  }
352 
353  fn scan_integer128(&mut self, buf: &mut String) -> Result<()> {
354  match e!(self.next_char_or_null()) {
355  b'0' => {
356  buf.push('0');
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)),
360  _ => Ok(()),
361  }
362  }
363  c @ b'1'..=b'9' => {
364  buf.push(c as char);
365  while let c @ b'0'..=b'9' = e!(self.peek_or_null()) {
366  self.eat_char();
367  buf.push(c as char);
368  }
369  Ok(())
370  }
371  _ => Err(self.error(ErrorCode::InvalidNumber)),
372  }
373  }
374 
375  #[cold]
376  fn fix_position(&self, err: Error) -> Error {
377  err.fix_position(move |code| self.error(code))
378  }
379 
380  fn parse_ident(&mut self, ident: &[u8]) -> Result<()> {
381  for expected in ident {
382  match e!(self.next_char()) {
383  None => {
384  return Err(self.error(ErrorCode::EofWhileParsingValue));
385  }
386  Some(next) => {
387  if next != *expected {
388  return Err(self.error(ErrorCode::ExpectedSomeSymbol));
389  }
390  }
391  }
392  }
393 
394  Ok(())
395  }
396 
397  fn parse_integer(&mut self, positive: bool) -> Result<ParserNumber> {
398  let next = match e!(self.next_char()) {
399  Some(b) => b,
400  None => {
401  return Err(self.error(ErrorCode::EofWhileParsingValue));
402  }
403  };
404 
405  match next {
406  b'0' => {
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),
411  }
412  }
413  c @ b'1'..=b'9' => {
414  let mut significand = (c - b'0') as u64;
415 
416  loop {
417  match e!(self.peek_or_null()) {
418  c @ b'0'..=b'9' => {
419  let digit = (c - b'0') as u64;
420 
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
424  // value as a `f64`.
425  if overflow!(significand * 10 + digit, u64::max_value()) {
426  return Ok(ParserNumber::F64(e!(
427  self.parse_long_integer(positive, significand),
428  )));
429  }
430 
431  self.eat_char();
432  significand = significand * 10 + digit;
433  }
434  _ => {
435  return self.parse_number(positive, significand);
436  }
437  }
438  }
439  }
440  _ => Err(self.error(ErrorCode::InvalidNumber)),
441  }
442  }
443 
444  fn parse_number(
445  &mut self,
446  positive: bool,
447  significand: u64,
448  ) -> Result<ParserNumber> {
449  Ok(match e!(self.peek_or_null()) {
450  b'.' => {
451  ParserNumber::F64(e!(self.parse_decimal(positive, significand, 0)))
452  }
453  b'e' | b'E' => {
454  ParserNumber::F64(e!(self.parse_exponent(positive, significand, 0)))
455  }
456  _ => {
457  if positive {
458  ParserNumber::U64(significand)
459  } else {
460  let neg = (significand as i64).wrapping_neg();
461 
462  // Convert into a float if we underflow, or on `-0`.
463  if neg >= 0 {
464  ParserNumber::F64(-(significand as f64))
465  } else {
466  ParserNumber::I64(neg)
467  }
468  }
469  }
470  })
471  }
472 
473  fn parse_decimal(
474  &mut self,
475  positive: bool,
476  mut significand: u64,
477  exponent_before_decimal_point: i32,
478  ) -> Result<f64> {
479  self.eat_char();
480 
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;
484 
485  if overflow!(significand * 10 + digit, u64::max_value()) {
486  let exponent =
487  exponent_before_decimal_point + exponent_after_decimal_point;
488  return self.parse_decimal_overflow(positive, significand, exponent);
489  }
490 
491  self.eat_char();
492  significand = significand * 10 + digit;
493  exponent_after_decimal_point -= 1;
494  }
495 
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)),
501  }
502  }
503 
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),
508  }
509  }
510 
511  fn parse_exponent(
512  &mut self,
513  positive: bool,
514  significand: u64,
515  starting_exp: i32,
516  ) -> Result<f64> {
517  self.eat_char();
518 
519  let positive_exp = match e!(self.peek_or_null()) {
520  b'+' => {
521  self.eat_char();
522  true
523  }
524  b'-' => {
525  self.eat_char();
526  false
527  }
528  _ => true,
529  };
530 
531  let next = match e!(self.next_char()) {
532  Some(b) => b,
533  None => {
534  return Err(self.error(ErrorCode::EofWhileParsingValue));
535  }
536  };
537 
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,
541  _ => {
542  return Err(self.error(ErrorCode::InvalidNumber));
543  }
544  };
545 
546  while let c @ b'0'..=b'9' = e!(self.peek_or_null()) {
547  self.eat_char();
548  let digit = (c - b'0') as i32;
549 
550  if overflow!(exp * 10 + digit, i32::max_value()) {
551  let zero_significand = significand == 0;
552  return self.parse_exponent_overflow(
553  positive,
554  zero_significand,
555  positive_exp,
556  );
557  }
558 
559  exp = exp * 10 + digit;
560  }
561 
562  let final_exp = if positive_exp {
563  starting_exp.saturating_add(exp)
564  } else {
565  starting_exp.saturating_sub(exp)
566  };
567 
568  self.f64_from_parts(positive, significand, final_exp)
569  }
570 
571  fn f64_from_parts(
572  &mut self,
573  positive: bool,
574  significand: u64,
575  mut exponent: i32,
576  ) -> Result<f64> {
577  let mut f = significand as f64;
578  loop {
579  match POW10.get(exponent.wrapping_abs() as usize) {
580  Some(&pow) => {
581  if exponent >= 0 {
582  f *= pow;
583  if f.is_infinite() {
584  return Err(self.error(ErrorCode::NumberOutOfRange));
585  }
586  } else {
587  f /= pow;
588  }
589  break;
590  }
591  None => {
592  if f == 0.0 {
593  break;
594  }
595  if exponent >= 0 {
596  return Err(self.error(ErrorCode::NumberOutOfRange));
597  }
598  f /= 1e308;
599  exponent += 308;
600  }
601  }
602  }
603  Ok(if positive { f } else { -f })
604  }
605 
606  #[cold]
607  #[inline(never)]
608  fn parse_long_integer(
609  &mut self,
610  positive: bool,
611  significand: u64,
612  ) -> Result<f64> {
613  let mut exponent = 0;
614  loop {
615  match e!(self.peek_or_null()) {
616  b'0'..=b'9' => {
617  self.eat_char();
618  // This could overflow... if your integer is gigabytes long.
619  // Ignore that possibility.
620  exponent += 1;
621  }
622  b'.' => {
623  return self.parse_decimal(positive, significand, exponent);
624  }
625  b'e' | b'E' => {
626  return self.parse_exponent(positive, significand, exponent);
627  }
628  _ => {
629  return self.f64_from_parts(positive, significand, exponent);
630  }
631  }
632  }
633  }
634 
635  #[cold]
636  #[inline(never)]
637  fn parse_decimal_overflow(
638  &mut self,
639  positive: bool,
640  significand: u64,
641  exponent: i32,
642  ) -> Result<f64> {
643  // The next multiply/add would overflow, so just ignore all further
644  // digits.
645  while let b'0'..=b'9' = e!(self.peek_or_null()) {
646  self.eat_char();
647  }
648 
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),
652  }
653  }
654 
655  // This cold code should not be inlined into the middle of the hot
656  // exponent-parsing loop above.
657  #[cold]
658  #[inline(never)]
659  fn parse_exponent_overflow(
660  &mut self,
661  positive: bool,
662  zero_significand: bool,
663  positive_exp: bool,
664  ) -> Result<f64> {
665  // Error instead of +/- infinity.
666  if !zero_significand && positive_exp {
667  return Err(self.error(ErrorCode::NumberOutOfRange));
668  }
669 
670  while let b'0'..=b'9' = e!(self.peek_or_null()) {
671  self.eat_char();
672  }
673  Ok(if positive { 0.0 } else { -0.0 })
674  }
675 
676  fn parse_any_signed_number(&mut self) -> Result<ParserNumber> {
677  let peek = match e!(self.peek()) {
678  Some(b) => b,
679  None => {
680  return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
681  }
682  };
683 
684  let value = match peek {
685  b'-' => {
686  self.eat_char();
687  self.parse_any_number(false)
688  }
689  b'0'..=b'9' => self.parse_any_number(true),
690  _ => Err(self.peek_error(ErrorCode::InvalidNumber)),
691  };
692 
693  let value = match e!(self.peek()) {
694  Some(_) => Err(self.peek_error(ErrorCode::InvalidNumber)),
695  None => value,
696  };
697 
698  match value {
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)),
706  }
707  }
708 
709  fn parse_any_number(&mut self, positive: bool) -> Result<ParserNumber> {
710  self.parse_integer(positive)
711  }
712 
713  fn end_seq(&mut self) -> Result<()> {
714  match e!(self.parse_whitespace()) {
715  Some(b')') => {
716  self.eat_char();
717  Ok(())
718  }
719  Some(_) => {
720  self.eat_char();
721  match self.parse_whitespace() {
722  _ => Err(self.peek_error(ErrorCode::TrailingCharacters)),
723  }
724  }
725  None => Err(self.peek_error(ErrorCode::EofWhileParsingList)),
726  }
727  }
728 
729  fn end_map(&mut self) -> Result<()> {
730  match e!(self.parse_whitespace()) {
731  Some(b')') => {
732  self.eat_char();
733  Ok(())
734  }
735  Some(_) => Err(self.peek_error(ErrorCode::TrailingCharacters)),
736  None => Err(self.peek_error(ErrorCode::EofWhileParsingObject)),
737  }
738  }
739 
740  fn ignore_value(&mut self) -> Result<()> {
741  self.scratch.clear();
742  let mut enclosing = None;
743 
744  loop {
745  let peek = match e!(self.parse_whitespace()) {
746  Some(b) => b,
747  None => {
748  return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
749  }
750  };
751 
752  let frame = match peek {
753  b'n' => {
754  self.eat_char();
755  e!(self.parse_ident(b"il"));
756  None
757  }
758  b't' => {
759  // TODO
760  self.eat_char();
761  e!(self.parse_ident(b"rue"));
762  None
763  }
764  b'f' => {
765  self.eat_char();
766  e!(self.parse_ident(b"alse"));
767  None
768  }
769  b'-' => {
770  self.eat_char();
771  e!(self.ignore_integer());
772  None
773  }
774  b'0'..=b'9' => {
775  e!(self.ignore_integer());
776  None
777  }
778  b'"' => {
779  self.eat_char();
780  e!(self.read.ignore_str());
781  None
782  }
783  frame @ b'(' => {
784  self.scratch.extend(enclosing.take());
785  self.eat_char();
786  Some(frame)
787  }
788  _ => return Err(self.peek_error(ErrorCode::ExpectedSomeValue)),
789  };
790 
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(()),
798  },
799  },
800  };
801 
802  loop {
803  match e!(self.parse_whitespace()) {
804  Some(b')') if frame == b'(' => {}
805  Some(_) => {
806  break;
807  }
808  None => {
809  return Err(self.peek_error(match frame {
810  b'(' => ErrorCode::EofWhileParsingList,
811  _ => unreachable!(),
812  }));
813  }
814  }
815 
816  self.eat_char();
817  frame = match self.scratch.pop() {
818  Some(frame) => frame,
819  None => return Ok(()),
820  };
821  }
822 
823  if frame == b'(' {
824  match e!(self.parse_whitespace()) {
825  Some(b'"') => self.eat_char(),
826  Some(_) => return Err(self.peek_error(ErrorCode::KeyMustBeASymbol)),
827  None => {
828  return Err(self.peek_error(ErrorCode::EofWhileParsingObject))
829  }
830  }
831  e!(self.read.ignore_str());
832  match e!(self.parse_whitespace()) {
833  Some(b':') => self.eat_char(),
834  Some(_) => {
835  return Err(self.peek_error(ErrorCode::EofWhileParsingObject))
836  }
837  None => {
838  return Err(self.peek_error(ErrorCode::EofWhileParsingObject))
839  }
840  }
841  }
842 
843  enclosing = Some(frame);
844  }
845  }
846 
847  fn ignore_integer(&mut self) -> Result<()> {
848  match e!(self.next_char_or_null()) {
849  b'0' => {
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));
853  }
854  }
855  b'1'..=b'9' => {
856  while let b'0'..=b'9' = e!(self.peek_or_null()) {
857  self.eat_char();
858  }
859  }
860  _ => {
861  return Err(self.error(ErrorCode::InvalidNumber));
862  }
863  }
864 
865  match e!(self.peek_or_null()) {
866  b'.' => self.ignore_decimal(),
867  b'e' | b'E' => self.ignore_exponent(),
868  _ => Ok(()),
869  }
870  }
871 
872  fn ignore_decimal(&mut self) -> Result<()> {
873  self.eat_char();
874 
875  let mut at_least_one_digit = false;
876  while let b'0'..=b'9' = e!(self.peek_or_null()) {
877  self.eat_char();
878  at_least_one_digit = true;
879  }
880 
881  if !at_least_one_digit {
882  return Err(self.peek_error(ErrorCode::InvalidNumber));
883  }
884 
885  match e!(self.peek_or_null()) {
886  b'e' | b'E' => self.ignore_exponent(),
887  _ => Ok(()),
888  }
889  }
890 
891  fn ignore_exponent(&mut self) -> Result<()> {
892  self.eat_char();
893 
894  match e!(self.peek_or_null()) {
895  b'+' | b'-' => self.eat_char(),
896  _ => {}
897  }
898 
899  // Make sure a digit follows the exponent place.
900  match e!(self.next_char_or_null()) {
901  b'0'..=b'9' => {}
902  _ => {
903  return Err(self.error(ErrorCode::InvalidNumber));
904  }
905  }
906 
907  while let b'0'..=b'9' = e!(self.peek_or_null()) {
908  self.eat_char();
909  }
910 
911  Ok(())
912  }
913 }
914 
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,
948 ];
949 
950 macro_rules! deserialize_number {
951  ($method:ident) => {
952  deserialize_number!($method, deserialize_number);
953  };
954 
955  ($method:ident, $using:ident) => {
956  fn $method<V>(self, visitor: V) -> Result<V::Value>
957  where
958  V: de::Visitor<'de>,
959  {
960  self.$using(visitor)
961  }
962  };
963 }
964 
965 macro_rules! if_checking_recursion_limit {
966  ($($body:tt)*) => {
967  $($body)*
968  };
969 }
970 
971 macro_rules! check_recursion {
972  ($this:ident $($body:tt)*) => {
973  if_checking_recursion_limit! {
974  $this.depth -= 1;
975  if $this.depth == 0 {
976  return Err($this.peek_error(ErrorCode::RecursionLimitExceeded));
977  }
978  }
979 
980  $this $($body)*
981 
982  if_checking_recursion_limit! {
983  $this.depth += 1;
984  }
985  };
986 }
987 
988 impl<'de, 'a, R: Read<'de>, F: ReadFormatter<'de>> de::Deserializer<'de>
989  for &'a mut Deserializer<R, F>
990 {
991  type Error = Error;
992 
993  #[inline]
994  fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
995  where
996  V: de::Visitor<'de>,
997  {
998  let peek = match e!(self.parse_whitespace()) {
999  Some(b) => b,
1000  None => {
1001  return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1002  }
1003  };
1004 
1005  let value = match peek {
1006  b'n' => {
1007  self.eat_char();
1008  e!(self.parse_ident(b"ull"));
1009  visitor.visit_unit()
1010  }
1011  b't' => {
1012  self.eat_char();
1013  e!(self.parse_ident(b"rue"));
1014  visitor.visit_bool(true)
1015  }
1016  b'f' => {
1017  self.eat_char();
1018  e!(self.parse_ident(b"alse"));
1019  visitor.visit_bool(false)
1020  }
1021  b'-' => {
1022  self.eat_char();
1023  e!(self.parse_any_number(false)).visit(visitor)
1024  }
1025  b'0'..=b'9' => e!(self.parse_any_number(true)).visit(visitor),
1026  b'"' => {
1027  self.eat_char();
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),
1032  }
1033  }
1034  b'(' => {
1035  check_recursion! {
1036  self.eat_char();
1037  let ret = visitor.visit_seq(SeqAccess::new(self));
1038  }
1039 
1040  match (ret, self.end_seq()) {
1041  (Ok(ret), Ok(())) => Ok(ret),
1042  (Err(err), _) | (_, Err(err)) => Err(err),
1043  }
1044  }
1045  _ => Err(self.peek_error(ErrorCode::ExpectedSomeValue)),
1046  };
1047 
1048  match value {
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)),
1056  }
1057  }
1058 
1059  fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
1060  where
1061  V: de::Visitor<'de>,
1062  {
1063  let peek = match e!(self.parse_whitespace()) {
1064  Some(b) => b,
1065  None => {
1066  return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1067  }
1068  };
1069 
1070  let value = match peek {
1071  b't' => {
1072  self.eat_char();
1073  e!(self.parse_ident(b"rue"));
1074  visitor.visit_bool(true)
1075  }
1076  b'f' => {
1077  self.eat_char();
1078  e!(self.parse_ident(b"alse"));
1079  visitor.visit_bool(false)
1080  }
1081  _ => Err(self.peek_invalid_type(&visitor)),
1082  };
1083 
1084  match value {
1085  Ok(value) => Ok(value),
1086  Err(err) => Err(self.fix_position(err)),
1087  }
1088  }
1089 
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);
1100 
1101  deserialize_number!(deserialize_i128, do_deserialize_i128);
1102  deserialize_number!(deserialize_u128, do_deserialize_u128);
1103 
1104  fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
1105  where
1106  V: de::Visitor<'de>,
1107  {
1108  self.deserialize_str(visitor)
1109  }
1110 
1111  fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
1112  where
1113  V: de::Visitor<'de>,
1114  {
1115  let peek = match e!(self.parse_whitespace()) {
1116  Some(b) => b,
1117  None => {
1118  return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1119  }
1120  };
1121 
1122  let value = match peek {
1123  b'"' => {
1124  self.eat_char();
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),
1129  }
1130  }
1131  _ => Err(self.peek_invalid_type(&visitor)),
1132  };
1133 
1134  match value {
1135  Ok(value) => Ok(value),
1136  Err(err) => Err(self.fix_position(err)),
1137  }
1138  }
1139 
1140  fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
1141  where
1142  V: de::Visitor<'de>,
1143  {
1144  self.deserialize_str(visitor)
1145  }
1146 
1147  /// Parses a SXP string as bytes. Note that this function does not check
1148  /// whether the bytes represent a valid UTF-8 string.
1149  ///
1150  /// The relevant part of the SXP specification is Section 8.2 of [RFC
1151  /// 7159]:
1152  ///
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.
1158  /// >
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.
1168  ///
1169  /// [RFC 7159]: https://tools.ietf.org/html/rfc7159
1170  ///
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.
1174  ///
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>
1178  where
1179  V: de::Visitor<'de>,
1180  {
1181  let peek = match e!(self.parse_whitespace()) {
1182  Some(b) => b,
1183  None => {
1184  return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1185  }
1186  };
1187 
1188  let value = match peek {
1189  b'"' => {
1190  self.eat_char();
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),
1195  }
1196  }
1197  b'(' => self.deserialize_seq(visitor),
1198  _ => Err(self.peek_invalid_type(&visitor)),
1199  };
1200 
1201  match value {
1202  Ok(value) => Ok(value),
1203  Err(err) => Err(self.fix_position(err)),
1204  }
1205  }
1206 
1207  #[inline]
1208  fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
1209  where
1210  V: de::Visitor<'de>,
1211  {
1212  self.deserialize_bytes(visitor)
1213  }
1214 
1215  /// Parses a `null` as a None, and any other values as a `Some(...)`.
1216  #[inline]
1217  fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
1218  where
1219  V: de::Visitor<'de>,
1220  {
1221  match e!(self.parse_whitespace()) {
1222  Some(b'n') => {
1223  self.eat_char();
1224  e!(self.parse_ident(b"ull"));
1225  visitor.visit_none()
1226  }
1227  _ => visitor.visit_some(self),
1228  }
1229  }
1230 
1231  fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
1232  where
1233  V: de::Visitor<'de>,
1234  {
1235  let peek = match e!(self.parse_whitespace()) {
1236  Some(b) => b,
1237  None => {
1238  return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1239  }
1240  };
1241 
1242  let value = match peek {
1243  b'n' => {
1244  self.eat_char();
1245  e!(self.parse_ident(b"il"));
1246  visitor.visit_unit()
1247  }
1248  _ => Err(self.peek_invalid_type(&visitor)),
1249  };
1250 
1251  match value {
1252  Ok(value) => Ok(value),
1253  Err(err) => Err(self.fix_position(err)),
1254  }
1255  }
1256 
1257  fn deserialize_unit_struct<V>(
1258  self,
1259  _name: &'static str,
1260  visitor: V,
1261  ) -> Result<V::Value>
1262  where
1263  V: de::Visitor<'de>,
1264  {
1265  self.deserialize_unit(visitor)
1266  }
1267 
1268  /// Parses a newtype struct as the underlying value.
1269  #[inline]
1270  fn deserialize_newtype_struct<V>(
1271  self,
1272  name: &str,
1273  visitor: V,
1274  ) -> Result<V::Value>
1275  where
1276  V: de::Visitor<'de>,
1277  {
1278  let _ = name;
1279  visitor.visit_newtype_struct(self)
1280  }
1281 
1282  fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
1283  where
1284  V: de::Visitor<'de>,
1285  {
1286  let peek = match e!(self.parse_whitespace()) {
1287  Some(b) => b,
1288  None => {
1289  return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1290  }
1291  };
1292 
1293  let value = match peek {
1294  b'(' => {
1295  check_recursion! {
1296  self.eat_char();
1297  let ret = visitor.visit_seq(SeqAccess::new(self));
1298  }
1299 
1300  match (ret, self.end_seq()) {
1301  (Ok(ret), Ok(())) => Ok(ret),
1302  (Err(err), _) | (_, Err(err)) => Err(err),
1303  }
1304  }
1305  _ => Err(self.peek_invalid_type(&visitor)),
1306  };
1307 
1308  match value {
1309  Ok(value) => Ok(value),
1310  Err(err) => Err(self.fix_position(err)),
1311  }
1312  }
1313 
1314  fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
1315  where
1316  V: de::Visitor<'de>,
1317  {
1318  self.deserialize_seq(visitor)
1319  }
1320 
1321  fn deserialize_tuple_struct<V>(
1322  self,
1323  _name: &'static str,
1324  _len: usize,
1325  visitor: V,
1326  ) -> Result<V::Value>
1327  where
1328  V: de::Visitor<'de>,
1329  {
1330  self.deserialize_seq(visitor)
1331  }
1332 
1333  fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
1334  where
1335  V: de::Visitor<'de>,
1336  {
1337  let peek = match e!(self.parse_whitespace()) {
1338  Some(b) => b,
1339  None => {
1340  return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1341  }
1342  };
1343 
1344  let value = match peek {
1345  b'(' => {
1346  check_recursion! {
1347  self.eat_char();
1348  let ret = visitor.visit_map(MapAccess::new(self));
1349  }
1350 
1351  match (ret, self.end_map()) {
1352  (Ok(ret), Ok(())) => Ok(ret),
1353  (Err(err), _) | (_, Err(err)) => Err(err),
1354  }
1355  }
1356  _ => Err(self.peek_invalid_type(&visitor)),
1357  };
1358 
1359  match value {
1360  Ok(value) => Ok(value),
1361  Err(err) => Err(self.fix_position(err)),
1362  }
1363  }
1364 
1365  fn deserialize_struct<V>(
1366  self,
1367  _name: &'static str,
1368  _fields: &'static [&'static str],
1369  visitor: V,
1370  ) -> Result<V::Value>
1371  where
1372  V: de::Visitor<'de>,
1373  {
1374  let peek = match e!(self.parse_whitespace()) {
1375  Some(b) => b,
1376  None => {
1377  return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1378  }
1379  };
1380 
1381  let value = match peek {
1382  b'(' => {
1383  check_recursion! {
1384  self.eat_char();
1385  let ret = visitor.visit_seq(SeqAccess::new(self));
1386  }
1387 
1388  match (ret, self.end_seq()) {
1389  (Ok(ret), Ok(())) => Ok(ret),
1390  (Err(err), _) | (_, Err(err)) => Err(err),
1391  }
1392  }
1393  _ => Err(self.peek_invalid_type(&visitor)),
1394  };
1395 
1396  match value {
1397  Ok(value) => Ok(value),
1398  Err(err) => Err(self.fix_position(err)),
1399  }
1400  }
1401 
1402  /// Parses an enum as an object like `{"$KEY":$VALUE}`, where $VALUE is either
1403  /// a straight value, a `[..]`, or a `{..}`.
1404  #[inline]
1405  fn deserialize_enum<V>(
1406  self,
1407  _name: &str,
1408  _variants: &'static [&'static str],
1409  visitor: V,
1410  ) -> Result<V::Value>
1411  where
1412  V: de::Visitor<'de>,
1413  {
1414  match e!(self.parse_whitespace()) {
1415  Some(b'(') => {
1416  check_recursion! {
1417  self.eat_char();
1418  let value = e!(visitor.visit_enum(VariantAccess::new(self)));
1419  }
1420 
1421  match e!(self.parse_whitespace()) {
1422  Some(b')') => {
1423  self.eat_char();
1424  Ok(value)
1425  }
1426  Some(_) => Err(self.error(ErrorCode::ExpectedSomeValue)),
1427  None => Err(self.error(ErrorCode::EofWhileParsingObject)),
1428  }
1429  }
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)),
1433  }
1434  }
1435 
1436  fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
1437  where
1438  V: de::Visitor<'de>,
1439  {
1440  self.deserialize_str(visitor)
1441  }
1442 
1443  fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
1444  where
1445  V: de::Visitor<'de>,
1446  {
1447  e!(self.ignore_value());
1448  visitor.visit_unit()
1449  }
1450 }
1451 
1452 struct SeqAccess<'a, R: 'a, F: 'a> {
1453  de: &'a mut Deserializer<R, F>,
1454  first: bool,
1455 }
1456 
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 }
1460  }
1461 }
1462 
1463 impl<'de, 'a, R: Read<'de> + 'a, F: ReadFormatter<'de> + 'a> de::SeqAccess<'de>
1464  for SeqAccess<'a, R, F>
1465 {
1466  type Error = Error;
1467 
1468  fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
1469  where
1470  T: de::DeserializeSeed<'de>,
1471  {
1472  let peek = match e!(self.de.parse_whitespace()) {
1473  Some(b')') => {
1474  return Ok(None);
1475  }
1476  Some(b) => {
1477  if self.first {
1478  self.first = false;
1479  }
1480  Some(b)
1481  }
1482  None => {
1483  return Err(self.de.peek_error(ErrorCode::EofWhileParsingList));
1484  }
1485  };
1486 
1487  match peek {
1488  Some(_) => Ok(Some(e!(seed.deserialize(&mut *self.de)))),
1489  None => Err(self.de.peek_error(ErrorCode::EofWhileParsingValue)),
1490  }
1491  }
1492 }
1493 
1494 struct MapAccess<'a, R: 'a, F> {
1495  de: &'a mut Deserializer<R, F>,
1496  first: bool,
1497 }
1498 
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 }
1502  }
1503 }
1504 
1505 impl<'de, 'a, R: Read<'de> + 'a, F: for<'r> ReadFormatter<'r>> de::MapAccess<'de>
1506  for MapAccess<'a, R, F>
1507 {
1508  type Error = Error;
1509 
1510  fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
1511  where
1512  K: de::DeserializeSeed<'de>,
1513  {
1514  let peek = match e!(self.de.parse_whitespace()) {
1515  Some(b')') => {
1516  return Ok(None);
1517  }
1518  Some(b) => {
1519  if self.first {
1520  self.first = false;
1521  }
1522  Some(b)
1523  }
1524  None => {
1525  return Err(self.de.peek_error(ErrorCode::EofWhileParsingObject));
1526  }
1527  };
1528 
1529  match peek {
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)),
1534  }
1535  }
1536 
1537  fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
1538  where
1539  V: de::DeserializeSeed<'de>,
1540  {
1541  e!(self.de.parse_whitespace());
1542  seed.deserialize(&mut *self.de)
1543  }
1544 }
1545 
1546 struct VariantAccess<'a, R: 'a, F: 'a> {
1547  de: &'a mut Deserializer<R, F>,
1548 }
1549 
1550 impl<'a, R: 'a, F: 'a> VariantAccess<'a, R, F> {
1551  fn new(de: &'a mut Deserializer<R, F>) -> Self {
1552  VariantAccess { de }
1553  }
1554 }
1555 
1556 impl<'de, 'a, R: Read<'de> + 'a, F: ReadFormatter<'de> + 'a> de::EnumAccess<'de>
1557  for VariantAccess<'a, R, F>
1558 {
1559  type Error = Error;
1560  type Variant = Self;
1561 
1562  fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self)>
1563  where
1564  V: de::DeserializeSeed<'de>,
1565  {
1566  let val = e!(seed.deserialize(&mut *self.de));
1567  e!(self.de.parse_whitespace());
1568  Ok((val, self))
1569  }
1570 }
1571 
1572 impl<'de, 'a, R: Read<'de> + 'a, F: ReadFormatter<'de> + 'a> de::VariantAccess<'de>
1573  for VariantAccess<'a, R, F>
1574 {
1575  type Error = Error;
1576 
1577  fn unit_variant(self) -> Result<()> {
1578  de::Deserialize::deserialize(self.de)
1579  }
1580 
1581  fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
1582  where
1583  T: de::DeserializeSeed<'de>,
1584  {
1585  seed.deserialize(self.de)
1586  }
1587 
1588  fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value>
1589  where
1590  V: de::Visitor<'de>,
1591  {
1592  de::Deserializer::deserialize_seq(self.de, visitor)
1593  }
1594 
1595  fn struct_variant<V>(
1596  self,
1597  fields: &'static [&'static str],
1598  visitor: V,
1599  ) -> Result<V::Value>
1600  where
1601  V: de::Visitor<'de>,
1602  {
1603  de::Deserializer::deserialize_struct(self.de, "", fields, visitor)
1604  }
1605 }
1606 
1607 struct UnitVariantAccess<'a, R: 'a, F: 'a> {
1608  de: &'a mut Deserializer<R, F>,
1609 }
1610 
1611 impl<'a, R: 'a, F: 'a> UnitVariantAccess<'a, R, F> {
1612  fn new(de: &'a mut Deserializer<R, F>) -> Self {
1613  UnitVariantAccess { de }
1614  }
1615 }
1616 
1617 impl<'de, 'a, R: Read<'de> + 'a, F: ReadFormatter<'de> + 'a> de::EnumAccess<'de>
1618  for UnitVariantAccess<'a, R, F>
1619 {
1620  type Error = Error;
1621  type Variant = Self;
1622 
1623  fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self)>
1624  where
1625  V: de::DeserializeSeed<'de>,
1626  {
1627  let variant = e!(seed.deserialize(&mut *self.de));
1628  Ok((variant, self))
1629  }
1630 }
1631 
1632 impl<'de, 'a, R: Read<'de> + 'a, F: ReadFormatter<'de> + 'a> de::VariantAccess<'de>
1633  for UnitVariantAccess<'a, R, F>
1634 {
1635  type Error = Error;
1636 
1637  fn unit_variant(self) -> Result<()> {
1638  Ok(())
1639  }
1640 
1641  fn newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value>
1642  where
1643  T: de::DeserializeSeed<'de>,
1644  {
1645  Err(de::Error::invalid_type(
1646  Unexpected::UnitVariant,
1647  &"newtype variant",
1648  ))
1649  }
1650 
1651  fn tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value>
1652  where
1653  V: de::Visitor<'de>,
1654  {
1655  Err(de::Error::invalid_type(
1656  Unexpected::UnitVariant,
1657  &"tuple variant",
1658  ))
1659  }
1660 
1661  fn struct_variant<V>(
1662  self,
1663  _fields: &'static [&'static str],
1664  _visitor: V,
1665  ) -> Result<V::Value>
1666  where
1667  V: de::Visitor<'de>,
1668  {
1669  Err(de::Error::invalid_type(
1670  Unexpected::UnitVariant,
1671  &"struct variant",
1672  ))
1673  }
1674 }
1675 
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>,
1680 }
1681 
1682 macro_rules! deserialize_numeric_key {
1683  ($method:ident) => {
1684  fn $method<V>(self, visitor: V) -> Result<V::Value>
1685  where
1686  V: de::Visitor<'de>,
1687  {
1688  self.deserialize_number(visitor)
1689  }
1690  };
1691 
1692  ($method:ident, $delegate:ident) => {
1693  fn $method<V>(self, visitor: V) -> Result<V::Value>
1694  where
1695  V: de::Visitor<'de>,
1696  {
1697  self.de.eat_char();
1698 
1699  match e!(self.de.peek()) {
1700  Some(b'0'..=b'9' | b'-') => {}
1701  _ => return Err(self.de.error(ErrorCode::InvalidNumber)),
1702  }
1703 
1704  let value = e!(self.de.$delegate(visitor));
1705 
1706  match e!(self.de.peek()) {
1707  Some(b'"') => self.de.eat_char(),
1708  _ => return Err(self.de.peek_error(ErrorCode::ExpectedDoubleQuote)),
1709  }
1710 
1711  Ok(value)
1712  }
1713  };
1714 }
1715 
1716 impl<'de, 'a, R, F> MapKey<'a, R, F>
1717 where
1718  R: Read<'de>,
1719  F: ReadFormatter<'a>,
1720 {
1721  deserialize_numeric_key!(deserialize_number, deserialize_number);
1722 }
1723 
1724 impl<'de, 'a, R, F: ReadFormatter<'a>> de::Deserializer<'de> for MapKey<'a, R, F>
1725 where
1726  R: Read<'de>,
1727 {
1728  type Error = Error;
1729 
1730  #[inline]
1731  fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
1732  where
1733  V: de::Visitor<'de>,
1734  {
1735  self.de.eat_char();
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),
1740  }
1741  }
1742 
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);
1755 
1756  #[inline]
1757  fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
1758  where
1759  V: de::Visitor<'de>,
1760  {
1761  // Map keys cannot be null.
1762  visitor.visit_some(self)
1763  }
1764 
1765  #[inline]
1766  fn deserialize_newtype_struct<V>(
1767  self,
1768  name: &'static str,
1769  visitor: V,
1770  ) -> Result<V::Value>
1771  where
1772  V: de::Visitor<'de>,
1773  {
1774  let _ = name;
1775  visitor.visit_newtype_struct(self)
1776  }
1777 
1778  #[inline]
1779  fn deserialize_enum<V>(
1780  self,
1781  name: &'static str,
1782  variants: &'static [&'static str],
1783  visitor: V,
1784  ) -> Result<V::Value>
1785  where
1786  V: de::Visitor<'de>,
1787  {
1788  self.de.deserialize_enum(name, variants, visitor)
1789  }
1790 
1791  #[inline]
1792  fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
1793  where
1794  V: de::Visitor<'de>,
1795  {
1796  self.de.deserialize_bytes(visitor)
1797  }
1798 
1799  #[inline]
1800  fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
1801  where
1802  V: de::Visitor<'de>,
1803  {
1804  self.de.deserialize_bytes(visitor)
1805  }
1806 
1807  forward_to_deserialize_any! {
1808  bool char str string unit unit_struct seq tuple tuple_struct map struct
1809  identifier ignored_any
1810  }
1811 }
1812 
1813 //////////////////////////////////////////////////////////////////////////////
1814 
1815 /// Iterator that deserializes a stream into multiple SXP values.
1816 ///
1817 /// A stream deserializer can be created from any SXP deserializer using the
1818 /// `Deserializer::into_iter` method.
1819 ///
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>,
1825  offset: usize,
1826  failed: bool,
1827  output: PhantomData<T>,
1828  lifetime: PhantomData<&'de ()>,
1829 }
1830 
1831 impl<'de, R, F, T> StreamDeserializer<'de, R, F, T>
1832 where
1833  R: read::Read<'de>,
1834  T: de::Deserialize<'de>,
1835  F: ReadFormatter<'de>,
1836 {
1837  /// Create a SXP stream deserializer from one of the possible sxp
1838  /// input sources.
1839  ///
1840  /// Typically it is more convenient to use one of these methods instead:
1841  ///
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),
1849  offset,
1850  failed: false,
1851  output: PhantomData,
1852  lifetime: PhantomData,
1853  }
1854  }
1855 
1856  /// Returns the number of bytes so far deserialized into a successful `T`.
1857  pub fn byte_offset(&self) -> usize {
1858  self.offset
1859  }
1860 
1861  fn peek_end_of_value(&mut self) -> Result<()> {
1862  match e!(self.de.peek()) {
1863  Some(
1864  b' ' | b'\n' | b'\t' | b'\r' | b'"' | b'(' | b')' | b',' // TODO
1865  | b':',
1866  )
1867  | None => Ok(()),
1868  Some(_) => {
1869  let position = self.de.read.peek_position();
1870  Err(Error::syntax(
1871  ErrorCode::TrailingCharacters,
1872  position.line,
1873  position.column,
1874  ))
1875  }
1876  }
1877  }
1878 }
1879 
1880 impl<'de, R, F, T> Iterator for StreamDeserializer<'de, R, F, T>
1881 where
1882  R: Read<'de>,
1883  T: de::Deserialize<'de>,
1884  F: ReadFormatter<'de>,
1885 {
1886  type Item = Result<T>;
1887 
1888  fn next(&mut self) -> Option<Result<T>> {
1889  if R::should_early_return_if_failed && self.failed {
1890  return None;
1891  }
1892 
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() {
1897  Ok(None) => {
1898  self.offset = self.de.read.byte_offset();
1899  None
1900  }
1901  Ok(Some(b)) => {
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,
1907  _ => false,
1908  };
1909  self.offset = self.de.read.byte_offset();
1910  let result = de::Deserialize::deserialize(&mut self.de);
1911 
1912  Some(match result {
1913  Ok(value) => {
1914  self.offset = self.de.read.byte_offset();
1915  if self_delineated_value {
1916  Ok(value)
1917  } else {
1918  self.peek_end_of_value().map(|_| value)
1919  }
1920  }
1921  Err(e) => {
1922  self.de.read.set_failed(&mut self.failed);
1923  Err(e)
1924  }
1925  })
1926  }
1927  Err(e) => {
1928  self.de.read.set_failed(&mut self.failed);
1929  Some(Err(e))
1930  }
1931  }
1932  }
1933 }
1934 
1935 impl<'de, R, F, T> FusedIterator for StreamDeserializer<'de, R, F, T>
1936 where
1937  R: Read<'de> + Fused,
1938  T: de::Deserialize<'de>,
1939  F: ReadFormatter<'de>,
1940 {
1941 }
1942 
1943 pub fn from_traits<'de, R: Read<'de>, F: ReadFormatter<'de>, T: de::Deserialize<'de>>(
1944  r: R,
1945  f: F,
1946 ) -> Result<T> {
1947  let mut de = Deserializer::new(r, f);
1948  let value = e!(de::Deserialize::deserialize(&mut de));
1949 
1950  // Make sure the whole stream has been consumed.
1951  e!(de.end());
1952  Ok(value)
1953 }
1954 
1955 pub fn from_reader<'de, R: crate::io::Read, T: de::DeserializeOwned>(
1956  rdr: R,
1957 ) -> Result<T> {
1958  from_traits(read::IoRead::new(rdr), DefaultFormatter)
1959 }
1960 
1961 pub fn from_str<'de, T: de::Deserialize<'de>>(v: &'de str) -> Result<T> {
1962  from_traits(read::StrRead::new(v), DefaultFormatter)
1963 }
1964 
1965 pub fn from_slice<'de, T: Deserialize<'de>>(v: &'de [u8]) -> Result<T> {
1966  from_traits(read::SliceRead::new(v), DefaultFormatter)
1967 }