serde_encom/des/
deserializer.rs

1use super::access::{MapAccess, SavedMapAccess, SavedSeqAccess, SeqAccess, VariantAccess};
2#[cfg(feature = "std")]
3use super::read::IoRead;
4use super::read::{Read, Reference, SliceRead, StrRead};
5use super::{parser_number::ParserNumber, stream_deserializer::StreamDeserializer};
6use crate::error::{Error, ErrorCode, Result};
7#[cfg(feature = "float_roundtrip")]
8use crate::lexical;
9use alloc::string::String;
10#[cfg(feature = "float_roundtrip")]
11use core::iter;
12use core::marker::PhantomData;
13use serde::de::{self, Expected, Unexpected};
14
15#[cfg(feature = "arbitrary_precision")]
16use crate::number::NumberDeserializer;
17
18macro_rules! overflow {
19    ($a:ident * 10 + $b:ident, $c:expr) => {
20        match $c {
21            c => $a >= c / 10 && ($a > c / 10 || $b > c % 10),
22        }
23    };
24}
25
26macro_rules! deserialize_number {
27    ($method:ident) => {
28        deserialize_number!($method, deserialize_number);
29    };
30
31    ($method:ident, $using:ident) => {
32        #[inline]
33        fn $method<V>(self, visitor: V) -> Result<V::Value>
34        where
35            V: de::Visitor<'de>,
36        {
37            self.$using(visitor)
38        }
39    };
40}
41
42#[cfg(not(feature = "unbounded_depth"))]
43macro_rules! if_checking_recursion_limit {
44    ($($body:tt)*) => {
45        $($body)*
46    };
47}
48
49#[cfg(feature = "unbounded_depth")]
50macro_rules! if_checking_recursion_limit {
51    ($this:ident $($body:tt)*) => {
52        if !$this.disable_recursion_limit {
53            $this $($body)*
54        }
55    };
56}
57
58macro_rules! check_recursion {
59    ($this:ident $($body:tt)*) => {
60        if_checking_recursion_limit! {
61            $this.remaining_depth -= 1;
62            if $this.remaining_depth == 0 {
63                return Err($this.peek_error(ErrorCode::RecursionLimitExceeded));
64            }
65        }
66
67        $this $($body)*
68
69        if_checking_recursion_limit! {
70            $this.remaining_depth += 1;
71        }
72    };
73}
74
75#[cfg(not(feature = "float_roundtrip"))]
76static POW10: [f64; 309] = [
77    1e000, 1e001, 1e002, 1e003, 1e004, 1e005, 1e006, 1e007, 1e008, 1e009, //
78    1e010, 1e011, 1e012, 1e013, 1e014, 1e015, 1e016, 1e017, 1e018, 1e019, //
79    1e020, 1e021, 1e022, 1e023, 1e024, 1e025, 1e026, 1e027, 1e028, 1e029, //
80    1e030, 1e031, 1e032, 1e033, 1e034, 1e035, 1e036, 1e037, 1e038, 1e039, //
81    1e040, 1e041, 1e042, 1e043, 1e044, 1e045, 1e046, 1e047, 1e048, 1e049, //
82    1e050, 1e051, 1e052, 1e053, 1e054, 1e055, 1e056, 1e057, 1e058, 1e059, //
83    1e060, 1e061, 1e062, 1e063, 1e064, 1e065, 1e066, 1e067, 1e068, 1e069, //
84    1e070, 1e071, 1e072, 1e073, 1e074, 1e075, 1e076, 1e077, 1e078, 1e079, //
85    1e080, 1e081, 1e082, 1e083, 1e084, 1e085, 1e086, 1e087, 1e088, 1e089, //
86    1e090, 1e091, 1e092, 1e093, 1e094, 1e095, 1e096, 1e097, 1e098, 1e099, //
87    1e100, 1e101, 1e102, 1e103, 1e104, 1e105, 1e106, 1e107, 1e108, 1e109, //
88    1e110, 1e111, 1e112, 1e113, 1e114, 1e115, 1e116, 1e117, 1e118, 1e119, //
89    1e120, 1e121, 1e122, 1e123, 1e124, 1e125, 1e126, 1e127, 1e128, 1e129, //
90    1e130, 1e131, 1e132, 1e133, 1e134, 1e135, 1e136, 1e137, 1e138, 1e139, //
91    1e140, 1e141, 1e142, 1e143, 1e144, 1e145, 1e146, 1e147, 1e148, 1e149, //
92    1e150, 1e151, 1e152, 1e153, 1e154, 1e155, 1e156, 1e157, 1e158, 1e159, //
93    1e160, 1e161, 1e162, 1e163, 1e164, 1e165, 1e166, 1e167, 1e168, 1e169, //
94    1e170, 1e171, 1e172, 1e173, 1e174, 1e175, 1e176, 1e177, 1e178, 1e179, //
95    1e180, 1e181, 1e182, 1e183, 1e184, 1e185, 1e186, 1e187, 1e188, 1e189, //
96    1e190, 1e191, 1e192, 1e193, 1e194, 1e195, 1e196, 1e197, 1e198, 1e199, //
97    1e200, 1e201, 1e202, 1e203, 1e204, 1e205, 1e206, 1e207, 1e208, 1e209, //
98    1e210, 1e211, 1e212, 1e213, 1e214, 1e215, 1e216, 1e217, 1e218, 1e219, //
99    1e220, 1e221, 1e222, 1e223, 1e224, 1e225, 1e226, 1e227, 1e228, 1e229, //
100    1e230, 1e231, 1e232, 1e233, 1e234, 1e235, 1e236, 1e237, 1e238, 1e239, //
101    1e240, 1e241, 1e242, 1e243, 1e244, 1e245, 1e246, 1e247, 1e248, 1e249, //
102    1e250, 1e251, 1e252, 1e253, 1e254, 1e255, 1e256, 1e257, 1e258, 1e259, //
103    1e260, 1e261, 1e262, 1e263, 1e264, 1e265, 1e266, 1e267, 1e268, 1e269, //
104    1e270, 1e271, 1e272, 1e273, 1e274, 1e275, 1e276, 1e277, 1e278, 1e279, //
105    1e280, 1e281, 1e282, 1e283, 1e284, 1e285, 1e286, 1e287, 1e288, 1e289, //
106    1e290, 1e291, 1e292, 1e293, 1e294, 1e295, 1e296, 1e297, 1e298, 1e299, //
107    1e300, 1e301, 1e302, 1e303, 1e304, 1e305, 1e306, 1e307, 1e308,
108];
109
110/// A structure that deserializes EnCom into Rust values.
111pub struct Deserializer<R> {
112    pub(crate) read: R,
113    pub(crate) remaining_depth: u8,
114    #[cfg(feature = "float_roundtrip")]
115    single_precision: bool,
116    #[cfg(feature = "unbounded_depth")]
117    disable_recursion_limit: bool,
118}
119
120impl<'de, R> Deserializer<R>
121where
122    R: Read<'de>,
123{
124    /// Create an EnCom deserializer from one of the possible serde_encom input
125    /// sources.
126    ///
127    /// Typically it is more convenient to use one of these methods instead:
128    ///
129    ///   - Deserializer::from_str
130    ///   - Deserializer::from_slice
131    ///   - Deserializer::from_reader
132    pub fn new(read: R) -> Self {
133        Deserializer {
134            read,
135            remaining_depth: 128,
136            #[cfg(feature = "float_roundtrip")]
137            single_precision: false,
138            #[cfg(feature = "unbounded_depth")]
139            disable_recursion_limit: false,
140        }
141    }
142}
143
144#[cfg(feature = "std")]
145impl<R> Deserializer<IoRead<R>>
146where
147    R: crate::io::Read,
148{
149    /// Creates an EnCom deserializer from an `io::Read`.
150    ///
151    /// Reader-based deserializers do not support deserializing borrowed types
152    /// like `&str`, since the `std::io::Read` trait has no non-copying methods
153    /// -- everything it does involves copying bytes out of the data source.
154    pub fn from_reader(reader: R) -> Self {
155        Deserializer::new(IoRead::new(reader))
156    }
157}
158
159impl<'a> Deserializer<SliceRead<'a>> {
160    /// Creates an EnCom deserializer from a `&[u8]`.
161    pub fn from_slice(bytes: &'a [u8]) -> Self {
162        Deserializer::new(SliceRead::new(bytes))
163    }
164}
165
166impl<'a> Deserializer<StrRead<'a>> {
167    /// Creates an EnCom deserializer from a `&str`.
168    pub fn from_str(s: &'a str) -> Self {
169        Deserializer::new(StrRead::new(s))
170    }
171}
172
173pub(crate) enum PreParser {
174    SavedMap,
175    Seq,
176    SavedSeq(SavedType),
177}
178
179#[derive(PartialEq)]
180pub(crate) enum SavedType {
181    Str,
182    Bytes,
183    Number,
184    FloatNumber,
185    // ExponentNumber,
186    None,
187}
188
189impl<'de, R: Read<'de>> Deserializer<R> {
190    /// The `Deserializer::end` method should be called after a value has been fully deserialized.
191    /// This allows the `Deserializer` to validate that the input stream is at the end or that it
192    /// only has trailing whitespace.
193    pub fn end(&mut self) -> Result<()> {
194        match self.parse_whitespace()? {
195            Some(_) => Err(self.peek_error(ErrorCode::TrailingCharacters)),
196            None => Ok(()),
197        }
198    }
199
200    /// Turn an EnCom deserializer into an iterator over values of type T.
201    pub fn into_iter<T>(self) -> StreamDeserializer<'de, R, T>
202    where
203        T: de::Deserialize<'de>,
204    {
205        // This cannot be an implementation of std::iter::IntoIterator because
206        // we need the caller to choose what T is.
207        let offset = self.read.byte_offset();
208        StreamDeserializer {
209            de: self,
210            offset,
211            failed: false,
212            output: PhantomData,
213            lifetime: PhantomData,
214        }
215    }
216
217    /// Parse arbitrarily deep EnCom structures without any consideration for
218    /// overflowing the stack.
219    ///
220    /// You will want to provide some other way to protect against stack
221    /// overflows, such as by wrapping your Deserializer in the dynamically
222    /// growing stack adapter provided by the serde_stacker crate. Additionally
223    /// you will need to be careful around other recursive operations on the
224    /// parsed result which may overflow the stack after deserialization has
225    /// completed, including, but not limited to, Display and Debug and Drop
226    /// impls.
227    ///
228    /// *This method is only available if serde_encom is built with the
229    /// `"unbounded_depth"` feature.*
230    ///
231    /// # Examples
232    ///
233    /// ```
234    /// use serde::Deserialize;
235    /// use serde_encom::Value;
236    ///
237    /// fn main() {
238    ///     let mut encom = String::new();
239    ///     for _ in 0..10000 {
240    ///         encom = format!("[{}]", encom);
241    ///     }
242    ///
243    ///     let mut deserializer = serde_encom::Deserializer::from_str(&encom);
244    ///     deserializer.disable_recursion_limit();
245    ///     let deserializer = serde_stacker::Deserializer::new(&mut deserializer);
246    ///     let value = Value::deserialize(deserializer).unwrap();
247    ///
248    ///     carefully_drop_nested_arrays(value);
249    /// }
250    ///
251    /// fn carefully_drop_nested_arrays(value: Value) {
252    ///     let mut stack = vec![value];
253    ///     while let Some(value) = stack.pop() {
254    ///         if let Value::Array(array) = value {
255    ///             stack.extend(array);
256    ///         }
257    ///     }
258    /// }
259    /// ```
260    #[cfg(feature = "unbounded_depth")]
261    #[cfg_attr(docsrs, doc(cfg(feature = "unbounded_depth")))]
262    pub fn disable_recursion_limit(&mut self) {
263        self.disable_recursion_limit = true;
264    }
265
266    #[inline]
267    pub(crate) fn peek(&mut self) -> Result<Option<u8>> {
268        self.read.peek()
269    }
270
271    #[inline]
272    fn peek_or_null(&mut self) -> Result<u8> {
273        Ok(self.peek()?.unwrap_or(b'\x00'))
274    }
275
276    #[inline]
277    pub(crate) fn eat_char(&mut self) {
278        self.read.discard();
279    }
280
281    #[inline]
282    pub(crate) fn next_char(&mut self) -> Result<Option<u8>> {
283        self.read.next()
284    }
285
286    #[inline]
287    fn next_char_or_null(&mut self) -> Result<u8> {
288        Ok(self.next_char()?.unwrap_or(b'\x00'))
289    }
290
291    /// Error caused by a byte from next_char().
292    #[cold]
293    pub(crate) fn error(&self, reason: ErrorCode) -> Error {
294        let position = self.read.position();
295        Error::syntax(reason, position.line, position.column)
296    }
297
298    /// Error caused by a byte from peek().
299    #[cold]
300    pub(crate) fn peek_error(&self, reason: ErrorCode) -> Error {
301        let position = self.read.peek_position();
302        Error::syntax(reason, position.line, position.column)
303    }
304
305    /// Returns the first non-whitespace byte without consuming it, or `None` if
306    /// EOF is encountered.
307    pub(crate) fn parse_whitespace(&mut self) -> Result<Option<u8>> {
308        loop {
309            match self.peek()? {
310                /* Some(b' ' | b'\n' | b'\t' | b'\r') */
311                Some(ch) if ch < 0x21 => {
312                    self.eat_char();
313                }
314                other => {
315                    return Ok(other);
316                }
317            }
318        }
319    }
320
321    #[inline]
322    fn pre_parser_match(&mut self) -> Result<PreParser> {
323        loop {
324            match self.peek()? {
325                Some(b':' | b'{' | b'[') => {
326                    return Ok(PreParser::SavedMap);
327                }
328                Some(b'=') => return Ok(PreParser::SavedSeq(SavedType::Str)),
329                Some(b'~') => return Ok(PreParser::SavedSeq(SavedType::Bytes)),
330                Some(b'.') => return Ok(PreParser::SavedSeq(SavedType::FloatNumber)),
331                /* Some(b'e' | b'E') => { // todo????
332                    return Ok(PreParser::SavedSeq(SavedState::ExponentNumber))
333                } */
334                Some(b'}' | b']' | b' ' | b'\n' | b'\t' | b'\r') | None => {
335                    return Ok(PreParser::SavedSeq(SavedType::Number));
336                }
337                _ => self.eat_char(),
338            }
339        }
340    }
341
342    /// `deserialize_any()` what value is after b'{' or init
343    /// no validation of chars, because atoi_simd will do it, if it is numbers
344    pub(crate) fn any_after_x7b(&mut self) -> Result<PreParser> {
345        if let Some(ch) = self.parse_whitespace()? {
346            if ch == b'{' || ch == b'[' || ch == b'-' || ch == b't' || ch == b'f' {
347                return Ok(PreParser::Seq);
348            }
349            self.read.save_start();
350        } else {
351            return Err(self.error(ErrorCode::EofWhileParsingValue));
352        }
353        let ret = self.pre_parser_match();
354        self.read.save_end();
355        ret
356    }
357
358    /// checks end of string or bytes
359    #[inline]
360    pub(crate) fn end_of_str_or_bytes(&mut self) -> Result<()> {
361        match self.peek()? {
362            Some(b'}' | b']' | b' ' | b'\n' | b'\t' | b'\r') | None => Ok(()),
363            _ => Err(self.peek_error(ErrorCode::UnexpectedEndOfString)),
364        }
365    }
366
367    #[inline]
368    pub(crate) fn deserialize_str_by_len<V>(&mut self, visitor: V, len: usize) -> Result<V::Value>
369    where
370        V: de::Visitor<'de>,
371    {
372        self.eat_char();
373        let res = visitor.visit_borrowed_str(self.read.read_str(len)?);
374        self.end_of_str_or_bytes()?;
375        res
376    }
377
378    #[inline]
379    pub(crate) fn deserialize_bytes_by_len<V>(&mut self, visitor: V, len: usize) -> Result<V::Value>
380    where
381        V: de::Visitor<'de>,
382    {
383        self.eat_char();
384        let res = visitor.visit_borrowed_bytes(self.read.read_slice(len)?);
385        self.end_of_str_or_bytes()?;
386        res
387    }
388
389    /// what value is in main deserializer `deserialize_any()`
390    pub(crate) fn any_map_value<V>(&mut self, visitor: V) -> Result<V::Value>
391    where
392        V: de::Visitor<'de>,
393    {
394        let parsed_int = self.read.parse_int_any_pos()?;
395        let ret = match self.peek()? {
396            Some(b'=') => self.deserialize_str_by_len(visitor, parsed_int as usize),
397            Some(b'~') => self.deserialize_bytes_by_len(visitor, parsed_int as usize),
398            Some(b'.') => visitor.visit_f64(self.parse_decimal(true, parsed_int, 0)?),
399            /* Some(b'e' | b'E') => {
400                ParserNumber::F64(self.parse_exponent(true, integer, 0)?).visit(visitor)
401            } */
402            Some(b'}' | b']' | b' ' | b'\n' | b'\t' | b'\r') | None => {
403                visitor.visit_u64(parsed_int)
404            }
405            Some(_) => Err(self.error(ErrorCode::ExpectedSomeIdent)), // todo: new error?
406        };
407        self.read.clear_saved();
408        ret
409    }
410
411    #[cold]
412    pub(crate) fn peek_invalid_type(&mut self, exp: &dyn Expected) -> Error {
413        let err = match self.peek_or_null().unwrap_or(b'\x00') {
414            b'n' => {
415                self.eat_char();
416                /* if let Err(err) = self.parse_ident(b"ull") {
417                    return err;
418                } */
419                de::Error::invalid_type(Unexpected::Unit, exp)
420            }
421            b't' => {
422                self.eat_char();
423                /* if let Err(err) = self.parse_ident(b"rue") {
424                    return err;
425                } */
426                de::Error::invalid_type(Unexpected::Bool(true), exp)
427            }
428            b'f' => {
429                self.eat_char();
430                /* if let Err(err) = self.parse_ident(b"alse") {
431                    return err;
432                } */
433                de::Error::invalid_type(Unexpected::Bool(false), exp)
434            }
435            b'-' => {
436                self.eat_char();
437                match self.parse_any_number(false) {
438                    Ok(n) => n.invalid_type(exp),
439                    Err(err) => return err,
440                }
441            }
442            b'0'..=b'9' => match self.parse_any_number(true) {
443                Ok(n) => n.invalid_type(exp),
444                Err(err) => return err,
445            },
446            /* b'"' => {
447                self.eat_char();
448                self.scratch.clear();
449                match self.read.parse_str(&mut self.scratch) {
450                    Ok(s) => de::Error::invalid_type(Unexpected::Str(&s), exp),
451                    Err(err) => return err,
452                }
453            } */
454            b'[' => de::Error::invalid_type(Unexpected::Seq, exp),
455            b'{' => de::Error::invalid_type(Unexpected::Map, exp),
456            _ => self.peek_error(ErrorCode::ExpectedSomeValue),
457        };
458
459        self.fix_position(err)
460    }
461
462    pub(crate) fn deserialize_number<'any, V>(&mut self, visitor: V) -> Result<V::Value>
463    where
464        V: de::Visitor<'any>,
465    {
466        let peek = match self.parse_whitespace()? {
467            Some(b) => b,
468            None => {
469                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
470            }
471        };
472
473        let value = match peek {
474            b'-' => {
475                self.eat_char();
476                self.parse_integer(false)?.visit(visitor)
477            }
478            b'0'..=b'9' => self.parse_integer(true)?.visit(visitor),
479            _ => Err(self.peek_invalid_type(&visitor)),
480        };
481
482        match value {
483            Ok(value) => Ok(value),
484            Err(err) => Err(self.fix_position(err)),
485        }
486    }
487
488    #[cfg(feature = "float_roundtrip")]
489    pub(crate) fn do_deserialize_f32<'any, V>(&mut self, visitor: V) -> Result<V::Value>
490    where
491        V: de::Visitor<'any>,
492    {
493        self.single_precision = true;
494        let val = self.deserialize_number(visitor);
495        self.single_precision = false;
496        val
497    }
498
499    // TODO: rewrite
500    pub(crate) fn do_deserialize_i128<'any, V>(&mut self, visitor: V) -> Result<V::Value>
501    where
502        V: de::Visitor<'any>,
503    {
504        let mut buf = String::new();
505
506        match self.parse_whitespace()? {
507            Some(b'-') => {
508                self.eat_char();
509                buf.push('-');
510            }
511            Some(_) => {}
512            None => {
513                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
514            }
515        };
516
517        self.scan_integer128(&mut buf)?;
518
519        let value = match buf.parse() {
520            Ok(int) => visitor.visit_i128(int),
521            Err(_) => {
522                return Err(self.error(ErrorCode::NumberOutOfRange));
523            }
524        };
525
526        match value {
527            Ok(value) => Ok(value),
528            Err(err) => Err(self.fix_position(err)),
529        }
530    }
531
532    // TODO: rewrite
533    pub(crate) fn do_deserialize_u128<'any, V>(&mut self, visitor: V) -> Result<V::Value>
534    where
535        V: de::Visitor<'any>,
536    {
537        match self.parse_whitespace()? {
538            Some(b'-') => {
539                return Err(self.peek_error(ErrorCode::NumberOutOfRange));
540            }
541            Some(_) => {}
542            None => {
543                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
544            }
545        }
546
547        let mut buf = String::new();
548        self.scan_integer128(&mut buf)?;
549
550        let value = match buf.parse() {
551            Ok(int) => visitor.visit_u128(int),
552            Err(_) => {
553                return Err(self.error(ErrorCode::NumberOutOfRange));
554            }
555        };
556
557        match value {
558            Ok(value) => Ok(value),
559            Err(err) => Err(self.fix_position(err)),
560        }
561    }
562
563    // TODO: remove?
564    fn scan_integer128(&mut self, buf: &mut String) -> Result<()> {
565        match self.next_char_or_null()? {
566            b'0' => {
567                buf.push('0');
568                // There can be only one leading '0'.
569                match self.peek_or_null()? {
570                    b'0'..=b'9' => Err(self.peek_error(ErrorCode::InvalidNumber)),
571                    _ => Ok(()),
572                }
573            }
574            c @ b'1'..=b'9' => {
575                buf.push(c as char);
576                while let c @ b'0'..=b'9' = self.peek_or_null()? {
577                    self.eat_char();
578                    buf.push(c as char);
579                }
580                Ok(())
581            }
582            _ => Err(self.error(ErrorCode::InvalidNumber)),
583        }
584    }
585
586    #[cold]
587    pub(crate) fn fix_position(&self, err: Error) -> Error {
588        err.fix_position(move |code| self.error(code))
589    }
590
591    /* fn parse_ident(&mut self, ident: &[u8]) -> Result<()> {
592        for expected in ident {
593            match self.next_char()? {
594                None => {
595                    return Err(self.error(ErrorCode::EofWhileParsingValue));
596                }
597                Some(next) => {
598                    if next != *expected {
599                        return Err(self.error(ErrorCode::ExpectedSomeIdent));
600                    }
601                }
602            }
603        }
604
605        Ok(())
606    } */
607
608    /* fn parse_integer_old(&mut self, positive: bool) -> Result<ParserNumber> {
609        let next = match self.next_char()? {
610            Some(b) => b,
611            None => {
612                return Err(self.error(ErrorCode::EofWhileParsingValue));
613            }
614        };
615
616        match next {
617            b'0' => {
618                // There can be only one leading '0'.
619                match self.peek_or_null()? {
620                    b'0'..=b'9' => Err(self.peek_error(ErrorCode::InvalidNumber)),
621                    _ => self.parse_number(positive, 0),
622                }
623            }
624            c @ b'1'..=b'9' => {
625                // SIMD version
626                /* self.scratch.clear();
627                self.scratch.push(c);
628
629                while let Some(ch) = self.peek()? {
630                    if ch < b'0' || ch > b'9' {
631                        break;
632                    }
633                    self.scratch.push(ch);
634                    self.eat_char();
635                }
636                return self.parse_number(positive, parse(self.scratch.get_slice()).unwrap()); */
637
638                // Original version
639                let mut significand = (c & 0xF) as u64;
640
641                loop {
642                    match self.peek_or_null()? {
643                        c @ b'0'..=b'9' => {
644                            let digit = (c & 0xF) as u64;
645
646                            // We need to be careful with overflow. If we can,
647                            // try to keep the number as a `u64` until we grow
648                            // too large. At that point, switch to parsing the
649                            // value as a `f64`.
650                            if overflow!(significand * 10 + digit, u64::MAX) {
651                                return Ok(ParserNumber::F64(
652                                    self.parse_long_integer(positive, significand)?,
653                                ));
654                            }
655
656                            significand = significand * 10 + digit;
657                            self.eat_char();
658                        }
659                        _ => {
660                            return self.parse_number(positive, significand);
661                        }
662                    }
663                }
664            }
665            _ => Err(self.error(ErrorCode::InvalidNumber)),
666        }
667    } */
668
669    fn parse_integer(&mut self, positive: bool) -> Result<ParserNumber> {
670        // if positive {
671        let significand = self.read.parse_int_any_pos()?;
672        self.parse_number(positive, significand)
673        /* } else {
674            self.parse_integer_old(false)
675        } */
676    }
677
678    #[inline]
679    fn parse_number(&mut self, positive: bool, significand: u64) -> Result<ParserNumber> {
680        Ok(match self.peek_or_null()? {
681            b'.' => ParserNumber::F64(self.parse_decimal(positive, significand, 0)?),
682            b'e' | b'E' => ParserNumber::F64(self.parse_exponent(positive, significand, 0)?),
683            _ => {
684                if positive {
685                    ParserNumber::U64(significand)
686                } else {
687                    let neg = (significand as i64).wrapping_neg();
688
689                    // Convert into a float if we underflow, or on `-0`.
690                    if neg >= 0 {
691                        ParserNumber::F64(-(significand as f64))
692                    } else {
693                        ParserNumber::I64(neg)
694                    }
695                }
696            }
697        })
698    }
699
700    pub(crate) fn parse_decimal(
701        &mut self,
702        positive: bool,
703        mut significand: u64,
704        exponent_before_decimal_point: i32,
705    ) -> Result<f64> {
706        self.eat_char();
707
708        let mut exponent_after_decimal_point = 0;
709        while let c @ b'0'..=b'9' = self.peek_or_null()? {
710            let digit = (c & 0xF) as u64;
711
712            if overflow!(significand * 10 + digit, u64::MAX) {
713                let exponent = exponent_before_decimal_point + exponent_after_decimal_point;
714                return self.parse_decimal_overflow(positive, significand, exponent);
715            }
716
717            self.eat_char();
718            significand = significand * 10 + digit;
719            exponent_after_decimal_point -= 1;
720        }
721
722        // Error if there is not at least one digit after the decimal point.
723        if exponent_after_decimal_point == 0 {
724            match self.peek()? {
725                Some(_) => return Err(self.peek_error(ErrorCode::InvalidNumber)),
726                None => return Err(self.peek_error(ErrorCode::EofWhileParsingValue)),
727            }
728        }
729
730        let exponent = exponent_before_decimal_point + exponent_after_decimal_point;
731        match self.peek_or_null()? {
732            b'e' | b'E' => self.parse_exponent(positive, significand, exponent),
733            _ => self.f64_from_parts(positive, significand, exponent),
734        }
735    }
736
737    fn parse_exponent(
738        &mut self,
739        positive: bool,
740        significand: u64,
741        starting_exp: i32,
742    ) -> Result<f64> {
743        self.eat_char();
744
745        let positive_exp = match self.peek_or_null()? {
746            b'+' => {
747                self.eat_char();
748                true
749            }
750            b'-' => {
751                self.eat_char();
752                false
753            }
754            _ => true,
755        };
756
757        let next = match self.next_char()? {
758            Some(b) => b,
759            None => {
760                return Err(self.error(ErrorCode::EofWhileParsingValue));
761            }
762        };
763
764        // Make sure a digit follows the exponent place.
765        let mut exp = match next {
766            c @ b'0'..=b'9' => (c & 0xF) as i32,
767            _ => {
768                return Err(self.error(ErrorCode::InvalidNumber));
769            }
770        };
771
772        while let c @ b'0'..=b'9' = self.peek_or_null()? {
773            self.eat_char();
774            let digit = (c & 0xF) as i32;
775
776            if overflow!(exp * 10 + digit, i32::MAX) {
777                let zero_significand = significand == 0;
778                return self.parse_exponent_overflow(positive, zero_significand, positive_exp);
779            }
780
781            exp = exp * 10 + digit;
782        }
783
784        let final_exp = if positive_exp {
785            starting_exp.saturating_add(exp)
786        } else {
787            starting_exp.saturating_sub(exp)
788        };
789
790        self.f64_from_parts(positive, significand, final_exp)
791    }
792
793    #[cfg(feature = "float_roundtrip")]
794    fn f64_from_parts(&mut self, positive: bool, significand: u64, exponent: i32) -> Result<f64> {
795        let f = if self.single_precision {
796            lexical::parse_concise_float::<f32>(significand, exponent) as f64
797        } else {
798            lexical::parse_concise_float::<f64>(significand, exponent)
799        };
800
801        if f.is_infinite() {
802            Err(self.error(ErrorCode::NumberOutOfRange))
803        } else {
804            Ok(if positive { f } else { -f })
805        }
806    }
807
808    #[cfg(not(feature = "float_roundtrip"))]
809    fn f64_from_parts(
810        &mut self,
811        positive: bool,
812        significand: u64,
813        mut exponent: i32,
814    ) -> Result<f64> {
815        let mut f = significand as f64;
816        loop {
817            match POW10.get(exponent.wrapping_abs() as usize) {
818                Some(&pow) => {
819                    if exponent >= 0 {
820                        f *= pow;
821                        if f.is_infinite() {
822                            return Err(self.error(ErrorCode::NumberOutOfRange));
823                        }
824                    } else {
825                        f /= pow;
826                    }
827                    break;
828                }
829                None => {
830                    if f == 0.0 {
831                        break;
832                    }
833                    if exponent >= 0 {
834                        return Err(self.error(ErrorCode::NumberOutOfRange));
835                    }
836                    f /= 1e308;
837                    exponent += 308;
838                }
839            }
840        }
841        Ok(if positive { f } else { -f })
842    }
843
844    /* #[cfg(feature = "float_roundtrip")]
845    #[cold]
846    #[inline(never)]
847    fn parse_long_integer(&mut self, positive: bool, partial_significand: u64) -> Result<f64> {
848        // To deserialize floats we'll first push the integer and fraction
849        // parts, both as byte strings, into the scratch buffer and then feed
850        // both slices to lexical's parser. For example if the input is
851        // `12.34e5` we'll push b"1234" into scratch and then pass b"12" and
852        // b"34" to lexical. `integer_end` will be used to track where to split
853        // the scratch buffer.
854        //
855        // Note that lexical expects the integer part to contain *no* leading
856        // zeroes and the fraction part to contain *no* trailing zeroes. The
857        // first requirement is already handled by the integer parsing logic.
858        // The second requirement will be enforced just before passing the
859        // slices to lexical in f64_long_from_parts.
860        self.scratch.clear();
861        self.scratch
862            .extend_from_slice(itoa::Buffer::new().format(partial_significand).as_bytes());
863
864        loop {
865            match tri!(self.peek_or_null()) {
866                c @ b'0'..=b'9' => {
867                    self.scratch.push(c);
868                    self.eat_char();
869                }
870                b'.' => {
871                    self.eat_char();
872                    return self.parse_long_decimal(positive, self.scratch.len());
873                }
874                b'e' | b'E' => {
875                    return self.parse_long_exponent(positive, self.scratch.len());
876                }
877                _ => {
878                    return self.f64_long_from_parts(positive, self.scratch.len(), 0);
879                }
880            }
881        }
882    }
883
884    #[cfg(not(feature = "float_roundtrip"))]
885    #[cold]
886    #[inline(never)]
887    fn parse_long_integer(&mut self, positive: bool, significand: u64) -> Result<f64> {
888        let mut exponent = 0;
889        loop {
890            match self.peek_or_null()? {
891                b'0'..=b'9' => {
892                    self.eat_char();
893                    // This could overflow... if your integer is gigabytes long.
894                    // Ignore that possibility.
895                    exponent += 1;
896                }
897                b'.' => {
898                    return self.parse_decimal(positive, significand, exponent);
899                }
900                b'e' | b'E' => {
901                    return self.parse_exponent(positive, significand, exponent);
902                }
903                _ => {
904                    return self.f64_from_parts(positive, significand, exponent);
905                }
906            }
907        }
908    } */
909
910    #[cfg(feature = "float_roundtrip")]
911    #[cold]
912    fn parse_long_decimal(&mut self, positive: bool, integer_end: usize) -> Result<f64> {
913        let mut at_least_one_digit = integer_end < self.scratch.len();
914        while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
915            self.scratch.push(c);
916            self.eat_char();
917            at_least_one_digit = true;
918        }
919
920        if !at_least_one_digit {
921            match tri!(self.peek()) {
922                Some(_) => return Err(self.peek_error(ErrorCode::InvalidNumber)),
923                None => return Err(self.peek_error(ErrorCode::EofWhileParsingValue)),
924            }
925        }
926
927        match tri!(self.peek_or_null()) {
928            b'e' | b'E' => self.parse_long_exponent(positive, integer_end),
929            _ => self.f64_long_from_parts(positive, integer_end, 0),
930        }
931    }
932
933    #[cfg(feature = "float_roundtrip")]
934    fn parse_long_exponent(&mut self, positive: bool, integer_end: usize) -> Result<f64> {
935        self.eat_char();
936
937        let positive_exp = match tri!(self.peek_or_null()) {
938            b'+' => {
939                self.eat_char();
940                true
941            }
942            b'-' => {
943                self.eat_char();
944                false
945            }
946            _ => true,
947        };
948
949        let next = match tri!(self.next_char()) {
950            Some(b) => b,
951            None => {
952                return Err(self.error(ErrorCode::EofWhileParsingValue));
953            }
954        };
955
956        // Make sure a digit follows the exponent place.
957        let mut exp = match next {
958            c @ b'0'..=b'9' => (c & 0xF) as i32,
959            _ => {
960                return Err(self.error(ErrorCode::InvalidNumber));
961            }
962        };
963
964        while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
965            self.eat_char();
966            let digit = (c & 0xF) as i32;
967
968            if overflow!(exp * 10 + digit, i32::MAX) {
969                let zero_significand = self.scratch.iter().all(|&digit| digit == b'0');
970                return self.parse_exponent_overflow(positive, zero_significand, positive_exp);
971            }
972
973            exp = exp * 10 + digit;
974        }
975
976        let final_exp = if positive_exp { exp } else { -exp };
977
978        self.f64_long_from_parts(positive, integer_end, final_exp)
979    }
980
981    // This cold code should not be inlined into the middle of the hot
982    // decimal-parsing loop above.
983    #[cfg(feature = "float_roundtrip")]
984    #[cold]
985    #[inline(never)]
986    fn parse_decimal_overflow(
987        &mut self,
988        positive: bool,
989        significand: u64,
990        exponent: i32,
991    ) -> Result<f64> {
992        let mut buffer = itoa::Buffer::new();
993        let significand = buffer.format(significand);
994        let fraction_digits = -exponent as usize;
995        self.scratch.clear();
996        if let Some(zeros) = fraction_digits.checked_sub(significand.len() + 1) {
997            self.scratch.extend(iter::repeat(b'0').take(zeros + 1));
998        }
999        self.scratch.extend_from_slice(significand.as_bytes());
1000        let integer_end = self.scratch.len() - fraction_digits;
1001        self.parse_long_decimal(positive, integer_end)
1002    }
1003
1004    #[cfg(not(feature = "float_roundtrip"))]
1005    #[cold]
1006    #[inline(never)]
1007    fn parse_decimal_overflow(
1008        &mut self,
1009        positive: bool,
1010        significand: u64,
1011        exponent: i32,
1012    ) -> Result<f64> {
1013        // The next multiply/add would overflow, so just ignore all further
1014        // digits.
1015        while let b'0'..=b'9' = self.peek_or_null()? {
1016            self.eat_char();
1017        }
1018
1019        match self.peek_or_null()? {
1020            b'e' | b'E' => self.parse_exponent(positive, significand, exponent),
1021            _ => self.f64_from_parts(positive, significand, exponent),
1022        }
1023    }
1024
1025    // This cold code should not be inlined into the middle of the hot
1026    // exponent-parsing loop above.
1027    #[cold]
1028    #[inline(never)]
1029    fn parse_exponent_overflow(
1030        &mut self,
1031        positive: bool,
1032        zero_significand: bool,
1033        positive_exp: bool,
1034    ) -> Result<f64> {
1035        // Error instead of +/- infinity.
1036        if !zero_significand && positive_exp {
1037            return Err(self.error(ErrorCode::NumberOutOfRange));
1038        }
1039
1040        while let b'0'..=b'9' = self.peek_or_null()? {
1041            self.eat_char();
1042        }
1043        Ok(if positive { 0.0 } else { -0.0 })
1044    }
1045
1046    #[cfg(feature = "float_roundtrip")]
1047    fn f64_long_from_parts(
1048        &mut self,
1049        positive: bool,
1050        integer_end: usize,
1051        exponent: i32,
1052    ) -> Result<f64> {
1053        let integer = &self.scratch[..integer_end];
1054        let fraction = &self.scratch[integer_end..];
1055
1056        let f = if self.single_precision {
1057            lexical::parse_truncated_float::<f32>(integer, fraction, exponent) as f64
1058        } else {
1059            lexical::parse_truncated_float::<f64>(integer, fraction, exponent)
1060        };
1061
1062        if f.is_infinite() {
1063            Err(self.error(ErrorCode::NumberOutOfRange))
1064        } else {
1065            Ok(if positive { f } else { -f })
1066        }
1067    }
1068
1069    // TODO: rewrite, but it's unreachable
1070    pub(crate) fn parse_any_signed_number(&mut self) -> Result<ParserNumber> {
1071        unreachable!();
1072        /* let peek = match self.peek()? {
1073            Some(b) => b,
1074            None => {
1075                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1076            }
1077        };
1078
1079        let value = match peek {
1080            b'-' => {
1081                self.eat_char();
1082                self.parse_any_number(false)
1083            }
1084            b'0'..=b'9' => self.parse_any_number(true),
1085            _ => Err(self.peek_error(ErrorCode::InvalidNumber)),
1086        };
1087
1088        let value = match self.peek()? {
1089            Some(_) => Err(self.peek_error(ErrorCode::InvalidNumber)),
1090            None => value,
1091        };
1092
1093        match value {
1094            Ok(value) => Ok(value),
1095            // The de::Error impl creates errors with unknown line and column.
1096            // Fill in the position here by looking at the current index in the
1097            // input. There is no way to tell whether this should call `error`
1098            // or `peek_error` so pick the one that seems correct more often.
1099            // Worst case, the position is off by one character.
1100            Err(err) => Err(self.fix_position(err)),
1101        } */
1102    }
1103
1104    #[cfg(not(feature = "arbitrary_precision"))]
1105    #[inline]
1106    pub(crate) fn parse_any_number(&mut self, positive: bool) -> Result<ParserNumber> {
1107        self.parse_integer(positive)
1108    }
1109
1110    #[cfg(feature = "arbitrary_precision")]
1111    fn parse_any_number(&mut self, positive: bool) -> Result<ParserNumber> {
1112        let mut buf = String::with_capacity(16);
1113        if !positive {
1114            buf.push('-');
1115        }
1116        self.scan_integer(&mut buf)?;
1117        if positive {
1118            if let Ok(unsigned) = buf.parse() {
1119                return Ok(ParserNumber::U64(unsigned));
1120            }
1121        } else {
1122            if let Ok(signed) = buf.parse() {
1123                return Ok(ParserNumber::I64(signed));
1124            }
1125        }
1126        Ok(ParserNumber::String(buf))
1127    }
1128
1129    #[cfg(feature = "arbitrary_precision")]
1130    fn scan_or_eof(&mut self, buf: &mut String) -> Result<u8> {
1131        match tri!(self.next_char()) {
1132            Some(b) => {
1133                buf.push(b as char);
1134                Ok(b)
1135            }
1136            None => Err(self.error(ErrorCode::EofWhileParsingValue)),
1137        }
1138    }
1139
1140    #[cfg(feature = "arbitrary_precision")]
1141    fn scan_integer(&mut self, buf: &mut String) -> Result<()> {
1142        match tri!(self.scan_or_eof(buf)) {
1143            b'0' => {
1144                // There can be only one leading '0'.
1145                match tri!(self.peek_or_null()) {
1146                    b'0'..=b'9' => Err(self.peek_error(ErrorCode::InvalidNumber)),
1147                    _ => self.scan_number(buf),
1148                }
1149            }
1150            b'1'..=b'9' => loop {
1151                match tri!(self.peek_or_null()) {
1152                    c @ b'0'..=b'9' => {
1153                        self.eat_char();
1154                        buf.push(c as char);
1155                    }
1156                    _ => {
1157                        return self.scan_number(buf);
1158                    }
1159                }
1160            },
1161            _ => Err(self.error(ErrorCode::InvalidNumber)),
1162        }
1163    }
1164
1165    #[cfg(feature = "arbitrary_precision")]
1166    fn scan_number(&mut self, buf: &mut String) -> Result<()> {
1167        match tri!(self.peek_or_null()) {
1168            b'.' => self.scan_decimal(buf),
1169            e @ (b'e' | b'E') => self.scan_exponent(e as char, buf),
1170            _ => Ok(()),
1171        }
1172    }
1173
1174    #[cfg(feature = "arbitrary_precision")]
1175    fn scan_decimal(&mut self, buf: &mut String) -> Result<()> {
1176        self.eat_char();
1177        buf.push('.');
1178
1179        let mut at_least_one_digit = false;
1180        while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
1181            self.eat_char();
1182            buf.push(c as char);
1183            at_least_one_digit = true;
1184        }
1185
1186        if !at_least_one_digit {
1187            match tri!(self.peek()) {
1188                Some(_) => return Err(self.peek_error(ErrorCode::InvalidNumber)),
1189                None => return Err(self.peek_error(ErrorCode::EofWhileParsingValue)),
1190            }
1191        }
1192
1193        match tri!(self.peek_or_null()) {
1194            e @ (b'e' | b'E') => self.scan_exponent(e as char, buf),
1195            _ => Ok(()),
1196        }
1197    }
1198
1199    #[cfg(feature = "arbitrary_precision")]
1200    fn scan_exponent(&mut self, e: char, buf: &mut String) -> Result<()> {
1201        self.eat_char();
1202        buf.push(e);
1203
1204        match tri!(self.peek_or_null()) {
1205            b'+' => {
1206                self.eat_char();
1207                buf.push('+');
1208            }
1209            b'-' => {
1210                self.eat_char();
1211                buf.push('-');
1212            }
1213            _ => {}
1214        }
1215
1216        // Make sure a digit follows the exponent place.
1217        match tri!(self.scan_or_eof(buf)) {
1218            b'0'..=b'9' => {}
1219            _ => {
1220                return Err(self.error(ErrorCode::InvalidNumber));
1221            }
1222        }
1223
1224        while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
1225            self.eat_char();
1226            buf.push(c as char);
1227        }
1228
1229        Ok(())
1230    }
1231
1232    pub(crate) fn parse_object_colon(&mut self) -> Result<()> {
1233        match self.parse_whitespace()? {
1234            Some(b':') => {
1235                self.eat_char();
1236                Ok(())
1237            }
1238            Some(b'{' | b'[') => Ok(()), // fixed ":{" here
1239            Some(_) => Err(self.peek_error(ErrorCode::ExpectedColon)),
1240            None => Err(self.peek_error(ErrorCode::EofWhileParsingObject)),
1241        }
1242    }
1243
1244    fn end_seq(&mut self) -> Result<()> {
1245        match self.parse_whitespace()? {
1246            Some(b']') => {
1247                self.eat_char();
1248                Ok(())
1249            }
1250            /* Some(b' ') => {
1251                self.eat_char();
1252                match self.parse_whitespace() {
1253                    Ok(Some(b'}')) => Err(self.peek_error(ErrorCode::TrailingComma)),
1254                    _ => Err(self.peek_error(ErrorCode::TrailingCharacters)),
1255                }
1256            } */
1257            Some(_) => Err(self.peek_error(ErrorCode::TrailingCharacters)),
1258            None => Err(self.peek_error(ErrorCode::EofWhileParsingList)),
1259        }
1260    }
1261
1262    #[inline]
1263    pub(crate) fn end_seq_init(&mut self) -> Result<()> {
1264        match self.parse_whitespace()? {
1265            Some(_) => Err(self.peek_error(ErrorCode::TrailingCharacters)),
1266            None => Ok(()),
1267        }
1268    }
1269
1270    fn end_map(&mut self) -> Result<()> {
1271        match self.parse_whitespace()? {
1272            Some(b'}') => {
1273                self.eat_char();
1274                Ok(())
1275            }
1276            // Some(b' ') => Err(self.peek_error(ErrorCode::TrailingComma)),
1277            Some(_) => Err(self.peek_error(ErrorCode::TrailingCharacters)),
1278            None => Err(self.peek_error(ErrorCode::EofWhileParsingObject)),
1279        }
1280    }
1281
1282    #[inline]
1283    pub(crate) fn end_map_init(&mut self) -> Result<()> {
1284        match self.parse_whitespace()? {
1285            Some(_) => Err(self.peek_error(ErrorCode::TrailingCharacters)),
1286            None => Ok(()),
1287        }
1288    }
1289
1290    fn ignore_value(&mut self) -> Result<()> {
1291        self.read.clear_saved();
1292        let mut enclosing = None;
1293
1294        loop {
1295            let peek = match self.parse_whitespace()? {
1296                Some(b) => b,
1297                None => {
1298                    return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1299                }
1300            };
1301
1302            let frame = match peek {
1303                b'n' => {
1304                    self.eat_char();
1305                    // self.parse_ident(b"ull")?;
1306                    None
1307                }
1308                b't' => {
1309                    self.eat_char();
1310                    // self.parse_ident(b"rue")?;
1311                    None
1312                }
1313                b'f' => {
1314                    self.eat_char();
1315                    // self.parse_ident(b"alse")?;
1316                    None
1317                }
1318                b'-' => {
1319                    self.eat_char();
1320                    self.ignore_integer()?;
1321                    None
1322                }
1323                b'0'..=b'9' => {
1324                    self.ignore_integer()?;
1325                    None
1326                }
1327                /* b'"' => {
1328                    self.eat_char();
1329                    self.read.ignore_str()?;
1330                    None
1331                } */
1332                frame @ b'{' | frame @ b'[' => {
1333                    /* if let Some(v) = enclosing.take() {
1334                        self.scratch.push(v);
1335                    } */
1336                    self.eat_char();
1337                    Some(frame)
1338                }
1339                _ => return Err(self.peek_error(ErrorCode::ExpectedSomeValue)),
1340            };
1341
1342            let (mut accept_comma, frame) = match frame {
1343                Some(frame) => (false, frame),
1344                None => match enclosing.take() {
1345                    Some(frame) => (true, frame),
1346                    // None => match self.scratch.pop() {
1347                    // Some(frame) => (true, frame),
1348                    None => return Ok(()),
1349                    // },
1350                },
1351            };
1352
1353            loop {
1354                match self.parse_whitespace()? {
1355                    Some(b' ') if accept_comma => {
1356                        self.eat_char();
1357                        break;
1358                    }
1359                    Some(b']') if frame == b'[' => {}
1360                    Some(b'}') if frame == b'{' => {}
1361                    Some(_) => {
1362                        if accept_comma {
1363                            return Err(self.peek_error(match frame {
1364                                b'[' => ErrorCode::ExpectedListCommaOrEnd,
1365                                b'{' => ErrorCode::ExpectedObjectCommaOrEnd,
1366                                _ => unreachable!(),
1367                            }));
1368                        } else {
1369                            break;
1370                        }
1371                    }
1372                    None => {
1373                        return Err(self.peek_error(match frame {
1374                            b'[' => ErrorCode::EofWhileParsingList,
1375                            b'{' => ErrorCode::EofWhileParsingObject,
1376                            _ => unreachable!(),
1377                        }));
1378                    }
1379                }
1380
1381                self.eat_char();
1382                /* frame = match self.scratch.pop() {
1383                    Some(frame) => frame,
1384                    None => return Ok(()),
1385                }; */
1386                accept_comma = true;
1387            }
1388
1389            if frame == b'{' || frame == b'[' {
1390                match self.parse_whitespace()? {
1391                    Some(b'"') => self.eat_char(),
1392                    Some(_) => return Err(self.peek_error(ErrorCode::KeyMustBeAString)),
1393                    None => return Err(self.peek_error(ErrorCode::EofWhileParsingObject)),
1394                }
1395                self.read.ignore_str()?;
1396                match self.parse_whitespace()? {
1397                    Some(b':') => self.eat_char(),
1398                    Some(_) => return Err(self.peek_error(ErrorCode::ExpectedColon)),
1399                    None => return Err(self.peek_error(ErrorCode::EofWhileParsingObject)),
1400                }
1401            }
1402
1403            enclosing = Some(frame);
1404        }
1405    }
1406
1407    fn ignore_integer(&mut self) -> Result<()> {
1408        match self.next_char_or_null()? {
1409            b'0' => {
1410                // There can be only one leading '0'.
1411                if let b'0'..=b'9' = self.peek_or_null()? {
1412                    return Err(self.peek_error(ErrorCode::InvalidNumber));
1413                }
1414            }
1415            b'1'..=b'9' => {
1416                while let b'0'..=b'9' = self.peek_or_null()? {
1417                    self.eat_char();
1418                }
1419            }
1420            _ => {
1421                return Err(self.error(ErrorCode::InvalidNumber));
1422            }
1423        }
1424
1425        match self.peek_or_null()? {
1426            b'.' => self.ignore_decimal(),
1427            b'e' | b'E' => self.ignore_exponent(),
1428            _ => Ok(()),
1429        }
1430    }
1431
1432    fn ignore_decimal(&mut self) -> Result<()> {
1433        self.eat_char();
1434
1435        let mut at_least_one_digit = false;
1436        while let b'0'..=b'9' = self.peek_or_null()? {
1437            self.eat_char();
1438            at_least_one_digit = true;
1439        }
1440
1441        if !at_least_one_digit {
1442            return Err(self.peek_error(ErrorCode::InvalidNumber));
1443        }
1444
1445        match self.peek_or_null()? {
1446            b'e' | b'E' => self.ignore_exponent(),
1447            _ => Ok(()),
1448        }
1449    }
1450
1451    fn ignore_exponent(&mut self) -> Result<()> {
1452        self.eat_char();
1453
1454        match self.peek_or_null()? {
1455            b'+' | b'-' => self.eat_char(),
1456            _ => {}
1457        }
1458
1459        // Make sure a digit follows the exponent place.
1460        match self.next_char_or_null()? {
1461            b'0'..=b'9' => {}
1462            _ => {
1463                return Err(self.error(ErrorCode::InvalidNumber));
1464            }
1465        }
1466
1467        while let b'0'..=b'9' = self.peek_or_null()? {
1468            self.eat_char();
1469        }
1470
1471        Ok(())
1472    }
1473
1474    #[cfg(feature = "raw_value")]
1475    fn deserialize_raw_value<V>(&mut self, visitor: V) -> Result<V::Value>
1476    where
1477        V: de::Visitor<'de>,
1478    {
1479        self.parse_whitespace()?;
1480        self.read.begin_raw_buffering();
1481        self.ignore_value()?;
1482        self.read.end_raw_buffering(visitor)
1483    }
1484}
1485
1486impl<'de, R: Read<'de>> de::Deserializer<'de> for &mut Deserializer<R> {
1487    type Error = Error;
1488
1489    #[inline]
1490    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
1491    where
1492        V: de::Visitor<'de>,
1493    {
1494        let peek = match self.parse_whitespace()? {
1495            Some(b) => b,
1496            None => {
1497                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1498            }
1499        };
1500
1501        let value = match peek {
1502            b'n' => {
1503                self.eat_char();
1504                // self.parse_ident(b"ull")?;
1505                visitor.visit_unit()
1506            }
1507            b't' => {
1508                self.eat_char();
1509                // self.parse_ident(b"rue")?;
1510                visitor.visit_bool(true)
1511            }
1512            b'f' => {
1513                self.eat_char();
1514                // self.parse_ident(b"alse")?;
1515                visitor.visit_bool(false)
1516            }
1517            b'-' => {
1518                self.eat_char();
1519                self.parse_any_number(false)?.visit(visitor)
1520            }
1521            // b'0'..=b'9' => self.parse_any_number(true)?.visit(visitor),
1522            /* b'"' => {
1523                self.eat_char();
1524                self.scratch.clear();
1525                match self.read.parse_str(&mut self.scratch)? {
1526                    Reference::Borrowed(s) => visitor.visit_borrowed_str(s),
1527                    Reference::Copied(s) => visitor.visit_str(s),
1528                }
1529            } */
1530            /* b'[' => {
1531                check_recursion! {
1532                    self.eat_char();
1533                    let ret = visitor.visit_seq(SeqAccess::new(self));
1534                }
1535
1536                match (ret, self.end_seq()) {
1537                    (Ok(ret), Ok(())) => Ok(ret),
1538                    (Err(err), _) | (_, Err(err)) => Err(err),
1539                }
1540            } */
1541            b'{' | b'[' => {
1542                check_recursion! {
1543                    self.eat_char();
1544                    let value = match self.any_after_x7b()? {
1545                        PreParser::SavedMap => {
1546                            let value = visitor.visit_map(SavedMapAccess::new(self));
1547                            (value, self.end_map())
1548                        }
1549                        PreParser::SavedSeq(v) => {
1550                            let value = visitor.visit_seq(SavedSeqAccess::new(self, v));
1551                            (value, self.end_seq())
1552                        }
1553                        PreParser::Seq => {
1554                            let value = visitor.visit_seq(SeqAccess::new(self));
1555                            (value, self.end_seq())
1556                        }
1557                    };
1558                }
1559                match value {
1560                    (Ok(ret), Ok(())) => Ok(ret),
1561                    (Err(err), _) | (_, Err(err)) => Err(err),
1562                }
1563            }
1564            _ => self.any_map_value(visitor),
1565        };
1566
1567        match value {
1568            Ok(value) => Ok(value),
1569            // The de::Error impl creates errors with unknown line and column.
1570            // Fill in the position here by looking at the current index in the
1571            // input. There is no way to tell whether this should call `error`
1572            // or `peek_error` so pick the one that seems correct more often.
1573            // Worst case, the position is off by one character.
1574            Err(err) => Err(self.fix_position(err)),
1575        }
1576    }
1577
1578    fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
1579    where
1580        V: de::Visitor<'de>,
1581    {
1582        let peek = match self.parse_whitespace()? {
1583            Some(b) => b,
1584            None => {
1585                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1586            }
1587        };
1588
1589        let value = match peek {
1590            b't' => {
1591                self.eat_char();
1592                // self.parse_ident(b"rue")?;
1593                visitor.visit_bool(true)
1594            }
1595            b'f' => {
1596                self.eat_char();
1597                // self.parse_ident(b"alse")?;
1598                visitor.visit_bool(false)
1599            }
1600            _ => Err(self.peek_invalid_type(&visitor)),
1601        };
1602
1603        match value {
1604            Ok(value) => Ok(value),
1605            Err(err) => Err(self.fix_position(err)),
1606        }
1607    }
1608
1609    deserialize_number!(deserialize_i8);
1610    deserialize_number!(deserialize_i16);
1611    deserialize_number!(deserialize_i32);
1612    deserialize_number!(deserialize_i64);
1613    deserialize_number!(deserialize_u8);
1614    deserialize_number!(deserialize_u16);
1615    deserialize_number!(deserialize_u32);
1616    deserialize_number!(deserialize_u64);
1617    #[cfg(not(feature = "float_roundtrip"))]
1618    deserialize_number!(deserialize_f32);
1619    deserialize_number!(deserialize_f64);
1620
1621    #[cfg(feature = "float_roundtrip")]
1622    deserialize_number!(deserialize_f32, do_deserialize_f32);
1623    deserialize_number!(deserialize_i128, do_deserialize_i128);
1624    deserialize_number!(deserialize_u128, do_deserialize_u128);
1625
1626    #[inline]
1627    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
1628    where
1629        V: de::Visitor<'de>,
1630    {
1631        self.deserialize_str(visitor)
1632    }
1633
1634    fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
1635    where
1636        V: de::Visitor<'de>,
1637    {
1638        /* let peek = match self.parse_whitespace()? {
1639            Some(b) => b,
1640            None => {
1641                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1642            }
1643        }; */
1644
1645        // takes str len before :
1646        let value = if let ParserNumber::U64(len) = self.parse_integer(true)? {
1647            self.deserialize_str_by_len(visitor, len as usize)
1648        } else {
1649            Err(self.peek_invalid_type(&visitor))
1650        };
1651
1652        /* let value = match peek {
1653            b'"' => {
1654                self.eat_char();
1655                self.scratch.clear();
1656                match self.read.parse_str(&mut self.scratch)? {
1657                    Reference::Borrowed(s) => visitor.visit_borrowed_str(s),
1658                    Reference::Copied(s) => visitor.visit_str(s),
1659                }
1660            }
1661            _ => Err(self.peek_invalid_type(&visitor)),
1662        }; */
1663
1664        match value {
1665            Ok(value) => Ok(value),
1666            Err(err) => Err(self.fix_position(err)),
1667        }
1668    }
1669
1670    #[inline]
1671    fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
1672    where
1673        V: de::Visitor<'de>,
1674    {
1675        self.deserialize_str(visitor)
1676    }
1677
1678    /// Parses an EnCom string as bytes. Note that this function does not check
1679    /// whether the bytes represent a valid UTF-8 string.
1680    ///
1681    /// The relevant part of the EnCom specification is Section 8.2 of [RFC
1682    /// 7159]:
1683    ///
1684    /// > When all the strings represented in an EnCom text are composed entirely
1685    /// > of Unicode characters (however escaped), then that EnCom text is
1686    /// > interoperable in the sense that all software implementations that
1687    /// > parse it will agree on the contents of names and of string values in
1688    /// > objects and arrays.
1689    /// >
1690    /// > However, the ABNF in this specification allows member names and string
1691    /// > values to contain bit sequences that cannot encode Unicode characters;
1692    /// > for example, "\uDEAD" (a single unpaired UTF-16 surrogate). Instances
1693    /// > of this have been observed, for example, when a library truncates a
1694    /// > UTF-16 string without checking whether the truncation split a
1695    /// > surrogate pair.  The behavior of software that receives EnCom texts
1696    /// > containing such values is unpredictable; for example, implementations
1697    /// > might return different values for the length of a string value or even
1698    /// > suffer fatal runtime exceptions.
1699    ///
1700    /// [RFC 7159]: https://tools.ietf.org/html/rfc7159
1701    ///
1702    /// The behavior of serde_encom is specified to fail on non-UTF-8 strings
1703    /// when deserializing into Rust UTF-8 string types such as String, and
1704    /// succeed with non-UTF-8 bytes when deserializing using this method.
1705    ///
1706    /// Escape sequences are processed as usual, and for `\uXXXX` escapes it is
1707    /// still checked if the hex number represents a valid Unicode code point.
1708    ///
1709    /// # Examples
1710    ///
1711    /// You can use this to parse EnCom strings containing invalid UTF-8 bytes,
1712    /// or unpaired surrogates.
1713    ///
1714    /// ```
1715    ///
1716    /// fn look_at_bytes() -> Result<(), serde_encom::Error> {
1717    ///     let encom_data = b"3=\xe5\x00\xe5";
1718    ///     let bytes: &[u8] = serde_encom::from_slice(encom_data)?;
1719    ///
1720    ///     assert_eq!(b'\xe5', bytes[0]);
1721    ///     assert_eq!(b'\0', bytes[1]);
1722    ///     assert_eq!(b'\xe5', bytes[2]);
1723    ///
1724    ///
1725    ///     Ok(())
1726    /// }
1727    /// #
1728    /// # look_at_bytes().unwrap();
1729    /// ```
1730    fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
1731    where
1732        V: de::Visitor<'de>,
1733    {
1734        /* let peek = match self.parse_whitespace()? {
1735            Some(b) => b,
1736            None => {
1737                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1738            }
1739        };
1740
1741        let value = match peek {
1742            /* b'"' => {
1743                self.eat_char();
1744                self.scratch.clear();
1745                match self.read.parse_str_raw(&mut self.scratch)? {
1746                    Reference::Borrowed(b) => visitor.visit_borrowed_bytes(b),
1747                    Reference::Copied(b) => visitor.visit_bytes(b),
1748                }
1749            } */
1750            b'{' => self.deserialize_seq(visitor),
1751            _ => Err(self.peek_invalid_type(&visitor)),
1752        }; */
1753
1754        let value = if let ParserNumber::U64(len) = self.parse_integer(true)? {
1755            self.deserialize_bytes_by_len(visitor, len as usize)
1756        } else {
1757            Err(self.peek_invalid_type(&visitor))
1758        };
1759
1760        match value {
1761            Ok(value) => Ok(value),
1762            Err(err) => Err(self.fix_position(err)),
1763        }
1764    }
1765
1766    #[inline]
1767    fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
1768    where
1769        V: de::Visitor<'de>,
1770    {
1771        self.deserialize_bytes(visitor)
1772    }
1773
1774    /// Parses a `null` as a None, and any other values as a `Some(...)`.
1775    #[inline]
1776    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
1777    where
1778        V: de::Visitor<'de>,
1779    {
1780        match self.parse_whitespace()? {
1781            Some(b'n') => {
1782                self.eat_char();
1783                // self.parse_ident(b"ull")?;
1784                visitor.visit_none()
1785            }
1786            _ => visitor.visit_some(self),
1787        }
1788    }
1789
1790    fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
1791    where
1792        V: de::Visitor<'de>,
1793    {
1794        let peek = match self.parse_whitespace()? {
1795            Some(b) => b,
1796            None => {
1797                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1798            }
1799        };
1800
1801        let value = match peek {
1802            b'n' => {
1803                self.eat_char();
1804                // self.parse_ident(b"ull")?;
1805                visitor.visit_unit()
1806            }
1807            _ => Err(self.peek_invalid_type(&visitor)),
1808        };
1809
1810        match value {
1811            Ok(value) => Ok(value),
1812            Err(err) => Err(self.fix_position(err)),
1813        }
1814    }
1815
1816    #[inline]
1817    fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
1818    where
1819        V: de::Visitor<'de>,
1820    {
1821        self.deserialize_unit(visitor)
1822    }
1823
1824    /// Parses a newtype struct as the underlying value.
1825    #[inline]
1826    fn deserialize_newtype_struct<V>(self, name: &str, visitor: V) -> Result<V::Value>
1827    where
1828        V: de::Visitor<'de>,
1829    {
1830        #[cfg(feature = "raw_value")]
1831        {
1832            if name == crate::raw::TOKEN {
1833                return self.deserialize_raw_value(visitor);
1834            }
1835        }
1836
1837        let _ = name;
1838        visitor.visit_newtype_struct(self)
1839    }
1840
1841    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
1842    where
1843        V: de::Visitor<'de>,
1844    {
1845        let peek = match self.parse_whitespace()? {
1846            Some(b) => b,
1847            None => {
1848                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1849            }
1850        };
1851
1852        let value = match peek {
1853            b'{' | b'[' => {
1854                check_recursion! {
1855                    self.eat_char();
1856                    let ret = visitor.visit_seq(SeqAccess::new(self));
1857                }
1858
1859                match (ret, self.end_seq()) {
1860                    (Ok(ret), Ok(())) => Ok(ret),
1861                    (Err(err), _) | (_, Err(err)) => Err(err),
1862                }
1863            }
1864            _ => Err(self.peek_invalid_type(&visitor)),
1865        };
1866
1867        match value {
1868            Ok(value) => Ok(value),
1869            Err(err) => Err(self.fix_position(err)),
1870        }
1871    }
1872
1873    #[inline]
1874    fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
1875    where
1876        V: de::Visitor<'de>,
1877    {
1878        self.deserialize_seq(visitor)
1879    }
1880
1881    #[inline]
1882    fn deserialize_tuple_struct<V>(
1883        self,
1884        _name: &'static str,
1885        _len: usize,
1886        visitor: V,
1887    ) -> Result<V::Value>
1888    where
1889        V: de::Visitor<'de>,
1890    {
1891        self.deserialize_seq(visitor)
1892    }
1893
1894    fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
1895    where
1896        V: de::Visitor<'de>,
1897    {
1898        let peek = match self.parse_whitespace()? {
1899            Some(b) => b,
1900            None => {
1901                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1902            }
1903        };
1904
1905        let value = match peek {
1906            b'{' => {
1907                check_recursion! {
1908                    self.eat_char();
1909                    let ret = visitor.visit_map(MapAccess::new(self));
1910                }
1911
1912                match (ret, self.end_map()) {
1913                    (Ok(ret), Ok(())) => Ok(ret),
1914                    (Err(err), _) | (_, Err(err)) => Err(err),
1915                }
1916            }
1917            _ => Err(self.peek_invalid_type(&visitor)),
1918        };
1919
1920        match value {
1921            Ok(value) => Ok(value),
1922            Err(err) => Err(self.fix_position(err)),
1923        }
1924    }
1925
1926    fn deserialize_struct<V>(
1927        self,
1928        _name: &'static str,
1929        _fields: &'static [&'static str],
1930        visitor: V,
1931    ) -> Result<V::Value>
1932    where
1933        V: de::Visitor<'de>,
1934    {
1935        let peek = match self.parse_whitespace()? {
1936            Some(b) => b,
1937            None => {
1938                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1939            }
1940        };
1941
1942        let value = match peek {
1943            /* b'[' => {
1944                check_recursion! {
1945                    self.eat_char();
1946                    let ret = visitor.visit_seq(SeqAccess::new(self));
1947                }
1948
1949                match (ret, self.end_seq()) {
1950                    (Ok(ret), Ok(())) => Ok(ret),
1951                    (Err(err), _) | (_, Err(err)) => Err(err),
1952                }
1953            } */
1954            b'{' => {
1955                check_recursion! {
1956                    self.eat_char();
1957                    let ret = visitor.visit_map(MapAccess::new(self));
1958                }
1959
1960                match (ret, self.end_map()) {
1961                    (Ok(ret), Ok(())) => Ok(ret),
1962                    (Err(err), _) | (_, Err(err)) => Err(err),
1963                }
1964            }
1965            _ => Err(self.peek_invalid_type(&visitor)),
1966        };
1967
1968        match value {
1969            Ok(value) => Ok(value),
1970            Err(err) => Err(self.fix_position(err)),
1971        }
1972    }
1973
1974    /// Parses an enum as an object like `{"$KEY":$VALUE}`, where $VALUE is either a straight
1975    /// value, a `[..]`, or a `{..}`.
1976    #[inline]
1977    fn deserialize_enum<V>(
1978        self,
1979        _name: &str,
1980        _variants: &'static [&'static str],
1981        visitor: V,
1982    ) -> Result<V::Value>
1983    where
1984        V: de::Visitor<'de>,
1985    {
1986        match self.parse_whitespace()? {
1987            Some(b'{') => {
1988                check_recursion! {
1989                    self.eat_char();
1990                    let value = visitor.visit_enum(VariantAccess::new(self))?;
1991                }
1992
1993                match self.parse_whitespace()? {
1994                    Some(b'}') => {
1995                        self.eat_char();
1996                        Ok(value)
1997                    }
1998                    Some(_) => Err(self.error(ErrorCode::ExpectedSomeValue)),
1999                    None => Err(self.error(ErrorCode::EofWhileParsingObject)),
2000                }
2001            }
2002            Some(_) => visitor.visit_enum(VariantAccess::new(self)), // it skips extra {} of enum
2003            // Some(b'"') => visitor.visit_enum(UnitVariantAccess::new(self)),
2004            // Some(_) => Err(self.peek_error(ErrorCode::ExpectedSomeValue)),
2005            None => Err(self.peek_error(ErrorCode::EofWhileParsingValue)),
2006        }
2007    }
2008
2009    fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
2010    where
2011        V: de::Visitor<'de>,
2012    {
2013        // self.deserialize_str(visitor) // originaly
2014        if self.parse_whitespace()?.is_none() {
2015            return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
2016        };
2017
2018        let value = {
2019            // self.read.clear_saved();
2020            match self.read.parse_str()? {
2021                Reference::Borrowed(s) => visitor.visit_borrowed_str(s),
2022                Reference::Copied(s) => visitor.visit_str(s),
2023            }
2024        };
2025
2026        match value {
2027            Ok(value) => Ok(value),
2028            Err(err) => Err(self.fix_position(err)),
2029        }
2030    }
2031
2032    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
2033    where
2034        V: de::Visitor<'de>,
2035    {
2036        self.ignore_value()?;
2037        visitor.visit_unit()
2038    }
2039}