Skip to main content

blazingly_json/
de.rs

1use crate::raw::RAW_JSON_TOKEN;
2use crate::raw_value::RAW_VALUE_TOKEN;
3use crate::{Error, Result};
4use serde::de::value::BorrowedStrDeserializer;
5use serde::de::{
6    self, DeserializeSeed, EnumAccess, IntoDeserializer, MapAccess, SeqAccess, VariantAccess,
7    Visitor,
8};
9use serde::Deserialize;
10use std::borrow::Cow;
11use std::fmt;
12use std::str;
13
14const MAX_DEPTH: usize = 128;
15const STRING_WORD_BYTES: usize = std::mem::size_of::<u64>();
16const ONE_BYTES: u64 = u64::MAX / 255;
17const HIGH_BYTES: u64 = ONE_BYTES << 7;
18
19#[inline]
20fn compact_number_end(bytes: &[u8], mut index: usize) -> Option<usize> {
21    if bytes.get(index) == Some(&b'-') {
22        index += 1;
23    }
24
25    match bytes.get(index).copied()? {
26        b'0' => {
27            index += 1;
28            if bytes.get(index).is_some_and(u8::is_ascii_digit) {
29                return None;
30            }
31        }
32        b'1'..=b'9' => {
33            index += 1;
34            while bytes.get(index).is_some_and(u8::is_ascii_digit) {
35                index += 1;
36            }
37        }
38        _ => return None,
39    }
40
41    if bytes.get(index) == Some(&b'.') {
42        index += 1;
43        let fraction_start = index;
44        while bytes.get(index).is_some_and(u8::is_ascii_digit) {
45            index += 1;
46        }
47        if index == fraction_start {
48            return None;
49        }
50    }
51
52    if matches!(bytes.get(index), Some(b'e' | b'E')) {
53        index += 1;
54        if matches!(bytes.get(index), Some(b'+' | b'-')) {
55            index += 1;
56        }
57        let exponent_start = index;
58        while bytes.get(index).is_some_and(u8::is_ascii_digit) {
59            index += 1;
60        }
61        if index == exponent_start {
62            return None;
63        }
64    }
65
66    Some(index)
67}
68
69#[inline]
70fn compact_number_array_end(bytes: &[u8], start: usize) -> Option<usize> {
71    let mut index = start;
72    if bytes.get(index) != Some(&b'[') {
73        return None;
74    }
75    index += 1;
76    if bytes.get(index) == Some(&b']') {
77        return Some(index + 1);
78    }
79
80    loop {
81        index = compact_number_end(bytes, index)?;
82        match bytes.get(index) {
83            Some(b',') => index += 1,
84            Some(b']') => return Some(index + 1),
85            _ => return None,
86        }
87    }
88}
89
90#[inline]
91fn compact_plain_string_end(bytes: &[u8], start: usize) -> Option<usize> {
92    if bytes.get(start) != Some(&b'"') {
93        return None;
94    }
95    let content_start = start + 1;
96    let special = content_start + find_string_special(&bytes[content_start..])?;
97    (bytes[special] == b'"').then_some(special + 1)
98}
99
100#[inline]
101fn compact_scalar_end(bytes: &[u8], start: usize) -> Option<usize> {
102    match bytes.get(start).copied()? {
103        b'"' => compact_plain_string_end(bytes, start),
104        b'-' | b'0'..=b'9' => compact_number_end(bytes, start),
105        b't' if bytes.get(start..start + 4) == Some(b"true") => Some(start + 4),
106        b'f' if bytes.get(start..start + 5) == Some(b"false") => Some(start + 5),
107        b'n' if bytes.get(start..start + 4) == Some(b"null") => Some(start + 4),
108        _ => None,
109    }
110}
111
112#[inline]
113fn compact_flat_object_array_end(bytes: &[u8], start: usize) -> Option<usize> {
114    if bytes.get(start..start + 2) == Some(b"[]") {
115        return Some(start + 2);
116    }
117    if bytes.get(start..start + 2) != Some(b"[{") {
118        return None;
119    }
120
121    let mut index = start + 2;
122    loop {
123        if bytes.get(index) != Some(&b'}') {
124            loop {
125                index = compact_plain_string_end(bytes, index)?;
126                if bytes.get(index) != Some(&b':') {
127                    return None;
128                }
129                index = compact_scalar_end(bytes, index + 1)?;
130                match bytes.get(index) {
131                    Some(b',') => index += 1,
132                    Some(b'}') => break,
133                    _ => return None,
134                }
135            }
136        }
137
138        index += 1;
139        match bytes.get(index) {
140            Some(b',') if bytes.get(index + 1) == Some(&b'{') => index += 2,
141            Some(b']') => return Some(index + 1),
142            _ => return None,
143        }
144    }
145}
146
147struct BorrowedRawMap<'de> {
148    raw: Option<&'de str>,
149    key_emitted: bool,
150}
151
152impl<'de> BorrowedRawMap<'de> {
153    #[inline]
154    const fn new(raw: &'de str) -> Self {
155        Self {
156            raw: Some(raw),
157            key_emitted: false,
158        }
159    }
160}
161
162impl<'de> MapAccess<'de> for BorrowedRawMap<'de> {
163    type Error = Error;
164
165    #[inline]
166    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
167    where
168        K: DeserializeSeed<'de>,
169    {
170        if self.raw.is_none() || self.key_emitted {
171            return Ok(None);
172        }
173        self.key_emitted = true;
174        seed.deserialize(BorrowedStrDeserializer::<Error>::new(RAW_VALUE_TOKEN))
175            .map(Some)
176    }
177
178    #[inline]
179    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
180    where
181        V: DeserializeSeed<'de>,
182    {
183        if !self.key_emitted {
184            return Err(Error::message("raw value requested before its marker"));
185        }
186        let raw = self
187            .raw
188            .take()
189            .ok_or_else(|| Error::message("raw value was already consumed"))?;
190        seed.deserialize(BorrowedStrDeserializer::<Error>::new(raw))
191    }
192}
193
194#[inline]
195fn find_string_special(bytes: &[u8]) -> Option<usize> {
196    let mut offset = 0;
197    let mut chunks = bytes.chunks_exact(STRING_WORD_BYTES);
198
199    for chunk in &mut chunks {
200        let word = u64::from_le_bytes(chunk.try_into().expect("u64-sized chunk"));
201        let contains_control = word.wrapping_sub(ONE_BYTES * 0x20) & !word;
202        let quote = word ^ (ONE_BYTES * u64::from(b'"'));
203        let contains_quote = quote.wrapping_sub(ONE_BYTES) & !quote;
204        let backslash = word ^ (ONE_BYTES * u64::from(b'\\'));
205        let contains_backslash = backslash.wrapping_sub(ONE_BYTES) & !backslash;
206        let special = (contains_control | contains_quote | contains_backslash) & HIGH_BYTES;
207
208        if special != 0 {
209            return Some(offset + special.trailing_zeros() as usize / 8);
210        }
211        offset += STRING_WORD_BYTES;
212    }
213
214    chunks
215        .remainder()
216        .iter()
217        .position(|&byte| byte < 0x20 || matches!(byte, b'"' | b'\\'))
218        .map(|relative| offset + relative)
219}
220
221/// A zero-copy Serde deserializer over a UTF-8 JSON slice.
222pub struct Deserializer<'de> {
223    input: &'de [u8],
224    source: Option<&'de str>,
225    index: usize,
226    depth: usize,
227}
228
229/// A low-level, allocation-free cursor for routing selected object fields.
230///
231/// Prefer normal Serde deserialization for application models. `JsonCursor` is
232/// intended for protocol envelopes whose hot path must inspect a few fields
233/// and defer large nested values as [`crate::RawJson`].
234pub struct JsonCursor<'de> {
235    deserializer: Deserializer<'de>,
236}
237
238/// Streaming view over one JSON object visited by [`JsonCursor::object`].
239pub struct Object<'cursor, 'de> {
240    deserializer: &'cursor mut Deserializer<'de>,
241    first: bool,
242    finished: bool,
243}
244
245/// One object member. The value must be consumed with one of this type's
246/// methods before requesting the next field.
247pub struct Field<'cursor, 'de> {
248    name: Cow<'de, str>,
249    deserializer: &'cursor mut Deserializer<'de>,
250}
251
252impl<'de> JsonCursor<'de> {
253    /// Creates a cursor over a byte slice.
254    #[must_use]
255    #[inline]
256    pub const fn from_slice(input: &'de [u8]) -> Self {
257        Self {
258            deserializer: Deserializer::from_slice(input),
259        }
260    }
261
262    /// Creates a cursor over a UTF-8 string.
263    #[must_use]
264    #[inline]
265    #[allow(clippy::should_implement_trait)]
266    pub fn from_str(input: &'de str) -> Self {
267        Self {
268            deserializer: Deserializer::from_str(input),
269        }
270    }
271
272    /// Visits the next value as an object.
273    ///
274    /// Unvisited fields are validated and skipped before this method returns.
275    ///
276    /// # Errors
277    ///
278    /// Returns an error for malformed JSON or when the next value is not an
279    /// object.
280    #[inline]
281    pub fn object<T>(
282        &mut self,
283        visitor: impl FnOnce(&mut Object<'_, 'de>) -> Result<T>,
284    ) -> Result<T> {
285        visit_object(&mut self.deserializer, visitor)
286    }
287
288    /// Verifies that no trailing value or garbage remains.
289    ///
290    /// # Errors
291    ///
292    /// Returns an error when non-whitespace input remains.
293    #[inline]
294    pub fn end(&mut self) -> Result<()> {
295        self.deserializer.end()
296    }
297}
298
299impl<'de> Object<'_, 'de> {
300    /// Returns the next field, or `None` after the closing brace.
301    ///
302    /// # Errors
303    ///
304    /// Returns an error for malformed object syntax.
305    #[inline]
306    pub fn next_field(&mut self) -> Result<Option<Field<'_, 'de>>> {
307        if self.finished {
308            return Ok(None);
309        }
310        self.deserializer.skip_whitespace();
311        if self.deserializer.input.get(self.deserializer.index) == Some(&b'}') {
312            self.deserializer.index += 1;
313            self.deserializer.leave();
314            self.finished = true;
315            return Ok(None);
316        }
317        if self.first {
318            self.first = false;
319        } else {
320            self.deserializer.expect_byte(b',')?;
321            if self.deserializer.peek() == Some(b'}') {
322                return Err(self.deserializer.error("trailing comma in object"));
323            }
324        }
325        let name = self.deserializer.parse_string()?;
326        self.deserializer.expect_byte(b':')?;
327        Ok(Some(Field {
328            name,
329            deserializer: self.deserializer,
330        }))
331    }
332
333    #[inline]
334    fn finish(&mut self) -> Result<()> {
335        while let Some(field) = self.next_field()? {
336            field.skip()?;
337        }
338        Ok(())
339    }
340}
341
342impl Drop for Object<'_, '_> {
343    fn drop(&mut self) {
344        if !self.finished {
345            self.deserializer.leave();
346        }
347    }
348}
349
350impl<'de> Field<'_, 'de> {
351    /// Returns this member's decoded field name.
352    #[must_use]
353    #[inline]
354    pub fn name(&self) -> &str {
355        &self.name
356    }
357
358    /// Skips and validates this member's value without constructing it.
359    ///
360    /// # Errors
361    ///
362    /// Returns an error for malformed JSON.
363    #[inline]
364    pub fn skip(self) -> Result<()> {
365        self.deserializer.skip_value()
366    }
367
368    /// Captures this member's value without allocating.
369    ///
370    /// # Errors
371    ///
372    /// Returns an error for malformed JSON.
373    #[inline]
374    pub fn raw(self) -> Result<crate::RawJson<'de>> {
375        self.deserializer.capture_raw().map(crate::RawJson::new)
376    }
377
378    /// Decodes this member as a string, borrowing when it has no escapes.
379    ///
380    /// # Errors
381    ///
382    /// Returns an error when the value is not a valid JSON string.
383    #[inline]
384    pub fn string(self) -> Result<Cow<'de, str>> {
385        self.deserializer.parse_string()
386    }
387
388    /// Deserializes this member into a Serde type.
389    ///
390    /// # Errors
391    ///
392    /// Returns an error for malformed JSON or a type mismatch.
393    #[inline]
394    pub fn deserialize<T: Deserialize<'de>>(self) -> Result<T> {
395        T::deserialize(&mut *self.deserializer)
396    }
397
398    /// Visits this member as a nested object.
399    ///
400    /// Unvisited nested fields are validated and skipped.
401    ///
402    /// # Errors
403    ///
404    /// Returns an error for malformed JSON or when the value is not an object.
405    #[inline]
406    pub fn object<T>(self, visitor: impl FnOnce(&mut Object<'_, 'de>) -> Result<T>) -> Result<T> {
407        visit_object(self.deserializer, visitor)
408    }
409}
410
411#[inline]
412fn visit_object<'de, T>(
413    deserializer: &mut Deserializer<'de>,
414    visitor: impl FnOnce(&mut Object<'_, 'de>) -> Result<T>,
415) -> Result<T> {
416    deserializer.expect_byte(b'{')?;
417    deserializer.enter()?;
418    let mut object = Object {
419        deserializer,
420        first: true,
421        finished: false,
422    };
423    let value = visitor(&mut object)?;
424    object.finish()?;
425    Ok(value)
426}
427
428impl<'de> Deserializer<'de> {
429    #[must_use]
430    pub const fn from_slice(input: &'de [u8]) -> Self {
431        Self {
432            input,
433            source: None,
434            index: 0,
435            depth: 0,
436        }
437    }
438
439    #[must_use]
440    #[allow(clippy::should_implement_trait)]
441    pub fn from_str(input: &'de str) -> Self {
442        Self {
443            input: input.as_bytes(),
444            source: Some(input),
445            index: 0,
446            depth: 0,
447        }
448    }
449
450    /// Verifies that the input contains no second value or trailing garbage.
451    ///
452    /// # Errors
453    ///
454    /// Returns an error when non-whitespace input remains.
455    pub fn end(&mut self) -> Result<()> {
456        self.skip_whitespace();
457        if self.index == self.input.len() {
458            Ok(())
459        } else {
460            Err(self.error("trailing characters"))
461        }
462    }
463
464    fn error(&self, message: impl Into<String>) -> Error {
465        Error::syntax(message, self.input, self.index)
466    }
467
468    #[inline]
469    fn utf8_source(&mut self) -> Result<&'de str> {
470        if let Some(source) = self.source {
471            return Ok(source);
472        }
473        let source =
474            str::from_utf8(self.input).map_err(|_| self.error("input is not valid UTF-8"))?;
475        self.source = Some(source);
476        Ok(source)
477    }
478
479    #[inline]
480    fn peek(&mut self) -> Option<u8> {
481        self.skip_whitespace();
482        self.input.get(self.index).copied()
483    }
484
485    #[inline]
486    fn skip_whitespace(&mut self) {
487        while matches!(
488            self.input.get(self.index),
489            Some(b' ' | b'\n' | b'\r' | b'\t')
490        ) {
491            self.index += 1;
492        }
493    }
494
495    #[inline]
496    fn expect_byte(&mut self, expected: u8) -> Result<()> {
497        self.skip_whitespace();
498        if self.input.get(self.index) == Some(&expected) {
499            self.index += 1;
500            Ok(())
501        } else {
502            Err(self.error(format!("expected `{}`", char::from(expected))))
503        }
504    }
505
506    #[inline]
507    fn parse_literal(&mut self, literal: &[u8]) -> Result<()> {
508        self.skip_whitespace();
509        let end = self.index.saturating_add(literal.len());
510        if self.input.get(self.index..end) == Some(literal) {
511            self.index = end;
512            Ok(())
513        } else {
514            Err(self.error("expected JSON literal"))
515        }
516    }
517
518    #[inline]
519    fn enter(&mut self) -> Result<()> {
520        if self.depth >= MAX_DEPTH {
521            return Err(self.error("recursion limit exceeded"));
522        }
523        self.depth += 1;
524        Ok(())
525    }
526
527    #[inline]
528    fn leave(&mut self) {
529        self.depth = self.depth.saturating_sub(1);
530    }
531
532    #[inline]
533    fn parse_string(&mut self) -> Result<Cow<'de, str>> {
534        self.skip_whitespace();
535        if self.input.get(self.index) != Some(&b'"') {
536            return Err(self.error("expected a string"));
537        }
538        self.index += 1;
539        let start = self.index;
540        let source = self.utf8_source()?;
541
542        let Some(relative) = find_string_special(&self.input[self.index..]) else {
543            return Err(self.error("unterminated string"));
544        };
545        let special = self.index + relative;
546        match self.input[special] {
547            b'"' => {
548                let raw = &self.input[start..special];
549                self.index = special + 1;
550                debug_assert_eq!(raw, &source.as_bytes()[start..special]);
551                Ok(Cow::Borrowed(&source[start..special]))
552            }
553            b'\\' => {
554                self.index = special;
555                self.parse_escaped_string(start)
556            }
557            _ => {
558                self.index = special;
559                Err(self.error("control character in string"))
560            }
561        }
562    }
563
564    fn parse_escaped_string(&mut self, start: usize) -> Result<Cow<'de, str>> {
565        let source = self.utf8_source()?;
566        let prefix = &source[start..self.index];
567        let mut output = String::with_capacity(prefix.len() + 8);
568        output.push_str(prefix);
569
570        loop {
571            match self.input.get(self.index).copied() {
572                Some(b'"') => {
573                    self.index += 1;
574                    return Ok(Cow::Owned(output));
575                }
576                Some(b'\\') => {
577                    self.index += 1;
578                    let escaped = self
579                        .input
580                        .get(self.index)
581                        .copied()
582                        .ok_or_else(|| self.error("unterminated escape"))?;
583                    self.index += 1;
584                    match escaped {
585                        b'"' => output.push('"'),
586                        b'\\' => output.push('\\'),
587                        b'/' => output.push('/'),
588                        b'b' => output.push('\u{0008}'),
589                        b'f' => output.push('\u{000c}'),
590                        b'n' => output.push('\n'),
591                        b'r' => output.push('\r'),
592                        b't' => output.push('\t'),
593                        b'u' => {
594                            let code = self.parse_hex_quad()?;
595                            if (0xD800..=0xDBFF).contains(&code) {
596                                if self.input.get(self.index..self.index + 2) != Some(b"\\u") {
597                                    return Err(self.error("high surrogate without low surrogate"));
598                                }
599                                self.index += 2;
600                                let low = self.parse_hex_quad()?;
601                                if !(0xDC00..=0xDFFF).contains(&low) {
602                                    return Err(self.error("invalid low surrogate"));
603                                }
604                                let scalar = 0x1_0000
605                                    + ((u32::from(code) - 0xD800) << 10)
606                                    + (u32::from(low) - 0xDC00);
607                                output.push(
608                                    char::from_u32(scalar)
609                                        .ok_or_else(|| self.error("invalid Unicode scalar"))?,
610                                );
611                            } else if (0xDC00..=0xDFFF).contains(&code) {
612                                return Err(self.error("unexpected low surrogate"));
613                            } else {
614                                output.push(
615                                    char::from_u32(u32::from(code))
616                                        .ok_or_else(|| self.error("invalid Unicode scalar"))?,
617                                );
618                            }
619                        }
620                        _ => return Err(self.error("invalid string escape")),
621                    }
622                }
623                Some(byte) if byte < 0x20 => {
624                    return Err(self.error("control character in string"));
625                }
626                Some(_) => {
627                    let segment_start = self.index;
628                    while let Some(&byte) = self.input.get(self.index) {
629                        if matches!(byte, b'"' | b'\\') || byte < 0x20 {
630                            break;
631                        }
632                        self.index += 1;
633                    }
634                    let segment = &source[segment_start..self.index];
635                    output.push_str(segment);
636                }
637                None => return Err(self.error("unterminated string")),
638            }
639        }
640    }
641
642    #[inline]
643    fn skip_string_at(&mut self) -> Result<()> {
644        if self.input.get(self.index) != Some(&b'"') {
645            return Err(self.error("expected a string"));
646        }
647        self.index += 1;
648
649        loop {
650            let Some(relative) = find_string_special(&self.input[self.index..]) else {
651                return Err(self.error("unterminated string"));
652            };
653            let special = self.index + relative;
654            match self.input[special] {
655                b'"' => {
656                    self.index = special + 1;
657                    return Ok(());
658                }
659                b'\\' => {
660                    self.index = special + 1;
661                    let escaped = self
662                        .input
663                        .get(self.index)
664                        .copied()
665                        .ok_or_else(|| self.error("unterminated escape"))?;
666                    self.index += 1;
667                    match escaped {
668                        b'"' | b'\\' | b'/' | b'b' | b'f' | b'n' | b'r' | b't' => {}
669                        b'u' => {
670                            let code = self.parse_hex_quad()?;
671                            if (0xD800..=0xDBFF).contains(&code) {
672                                if self.input.get(self.index..self.index + 2) != Some(b"\\u") {
673                                    return Err(self.error("high surrogate without low surrogate"));
674                                }
675                                self.index += 2;
676                                let low = self.parse_hex_quad()?;
677                                if !(0xDC00..=0xDFFF).contains(&low) {
678                                    return Err(self.error("invalid low surrogate"));
679                                }
680                            } else if (0xDC00..=0xDFFF).contains(&code) {
681                                return Err(self.error("unexpected low surrogate"));
682                            }
683                        }
684                        _ => return Err(self.error("invalid string escape")),
685                    }
686                }
687                _ => {
688                    self.index = special;
689                    return Err(self.error("control character in string"));
690                }
691            }
692        }
693    }
694
695    #[inline]
696    fn skip_value(&mut self) -> Result<()> {
697        self.utf8_source()?;
698        self.skip_whitespace();
699        self.skip_value_at()
700    }
701
702    #[inline]
703    fn skip_value_at(&mut self) -> Result<()> {
704        match self.input.get(self.index).copied() {
705            Some(b'n') => self.skip_literal_at(b"null"),
706            Some(b't') => self.skip_literal_at(b"true"),
707            Some(b'f') => self.skip_literal_at(b"false"),
708            Some(b'"') => self.skip_string_at(),
709            Some(b'-' | b'0'..=b'9') => self.skip_number(),
710            Some(b'[') => self.skip_array_at(),
711            Some(b'{') => self.skip_object_at(),
712            Some(_) => Err(self.error("expected a JSON value")),
713            None => Err(self.error("unexpected end of input")),
714        }
715    }
716
717    #[inline]
718    fn skip_literal_at(&mut self, literal: &[u8]) -> Result<()> {
719        let end = self.index.saturating_add(literal.len());
720        if self.input.get(self.index..end) == Some(literal) {
721            self.index = end;
722            Ok(())
723        } else {
724            Err(self.error("expected JSON literal"))
725        }
726    }
727
728    #[inline]
729    fn skip_array_at(&mut self) -> Result<()> {
730        debug_assert_eq!(self.input.get(self.index), Some(&b'['));
731        self.index += 1;
732        self.enter()?;
733        let result = (|| {
734            self.skip_whitespace();
735            if self.input.get(self.index) == Some(&b']') {
736                self.index += 1;
737                return Ok(());
738            }
739            loop {
740                self.skip_value_at()?;
741                self.skip_whitespace();
742                match self.input.get(self.index) {
743                    Some(b',') => {
744                        self.index += 1;
745                        self.skip_whitespace();
746                    }
747                    Some(b']') => {
748                        self.index += 1;
749                        return Ok(());
750                    }
751                    _ => return Err(self.error("expected `,` or `]`")),
752                }
753            }
754        })();
755        self.leave();
756        result
757    }
758
759    #[inline]
760    fn skip_object_at(&mut self) -> Result<()> {
761        debug_assert_eq!(self.input.get(self.index), Some(&b'{'));
762        self.index += 1;
763        self.enter()?;
764        let result = (|| {
765            self.skip_whitespace();
766            if self.input.get(self.index) == Some(&b'}') {
767                self.index += 1;
768                return Ok(());
769            }
770            loop {
771                self.skip_string_at()?;
772                self.skip_whitespace();
773                if self.input.get(self.index) != Some(&b':') {
774                    return Err(self.error("expected `:`"));
775                }
776                self.index += 1;
777                self.skip_whitespace();
778                self.skip_value_at()?;
779                self.skip_whitespace();
780                match self.input.get(self.index) {
781                    Some(b',') => {
782                        self.index += 1;
783                        self.skip_whitespace();
784                    }
785                    Some(b'}') => {
786                        self.index += 1;
787                        return Ok(());
788                    }
789                    _ => return Err(self.error("expected `,` or `}`")),
790                }
791            }
792        })();
793        self.leave();
794        result
795    }
796
797    #[inline]
798    fn capture_raw(&mut self) -> Result<&'de str> {
799        self.utf8_source()?;
800        self.skip_whitespace();
801        let start = self.index;
802        if let Some(end) = compact_number_array_end(self.input, start)
803            .or_else(|| compact_flat_object_array_end(self.input, start))
804        {
805            self.index = end;
806        } else {
807            self.skip_value_at()?;
808        }
809        let source = self
810            .source
811            .expect("capture_raw validates or receives UTF-8 input");
812        Ok(&source[start..self.index])
813    }
814
815    #[inline]
816    fn skip_number(&mut self) -> Result<()> {
817        let bytes = self.input;
818        let mut index = self.index;
819
820        if bytes.get(index) == Some(&b'-') {
821            index += 1;
822        }
823
824        match bytes.get(index).copied() {
825            Some(b'0') => {
826                index += 1;
827                if bytes.get(index).is_some_and(u8::is_ascii_digit) {
828                    self.index = index;
829                    return Err(self.error("leading zero in number"));
830                }
831            }
832            Some(b'1'..=b'9') => {
833                index += 1;
834                while bytes.get(index).is_some_and(u8::is_ascii_digit) {
835                    index += 1;
836                }
837            }
838            _ => {
839                self.index = index;
840                return Err(self.error("invalid number"));
841            }
842        }
843
844        if bytes.get(index) == Some(&b'.') {
845            index += 1;
846            let fraction_start = index;
847            while bytes.get(index).is_some_and(u8::is_ascii_digit) {
848                index += 1;
849            }
850            if index == fraction_start {
851                self.index = index;
852                return Err(self.error("fraction has no digits"));
853            }
854        }
855
856        if matches!(bytes.get(index), Some(b'e' | b'E')) {
857            index += 1;
858            if matches!(bytes.get(index), Some(b'+' | b'-')) {
859                index += 1;
860            }
861            let exponent_start = index;
862            while bytes.get(index).is_some_and(u8::is_ascii_digit) {
863                index += 1;
864            }
865            if index == exponent_start {
866                self.index = index;
867                return Err(self.error("exponent has no digits"));
868            }
869        }
870
871        self.index = index;
872        Ok(())
873    }
874
875    fn parse_hex_quad(&mut self) -> Result<u16> {
876        let end = self.index.saturating_add(4);
877        let digits = self
878            .input
879            .get(self.index..end)
880            .ok_or_else(|| self.error("incomplete Unicode escape"))?;
881        let mut value = 0_u16;
882        for &digit in digits {
883            value = value
884                .checked_mul(16)
885                .and_then(|value| value.checked_add(u16::from(hex_value(digit)?)))
886                .ok_or_else(|| self.error("invalid Unicode escape"))?;
887        }
888        self.index = end;
889        Ok(value)
890    }
891
892    #[inline]
893    fn parse_number(&mut self) -> Result<ParsedNumber<'de>> {
894        self.skip_whitespace();
895        let start = self.index;
896        let negative = self.input.get(self.index) == Some(&b'-');
897        if negative {
898            self.index += 1;
899        }
900
901        let mut magnitude = Some(0_u64);
902        match self.input.get(self.index).copied() {
903            Some(b'0') => {
904                self.index += 1;
905                if self.input.get(self.index).is_some_and(u8::is_ascii_digit) {
906                    return Err(self.error("leading zero in number"));
907                }
908            }
909            Some(first @ b'1'..=b'9') => {
910                magnitude = Some(u64::from(first - b'0'));
911                self.index += 1;
912                while let Some(digit @ b'0'..=b'9') = self.input.get(self.index).copied() {
913                    magnitude = magnitude.and_then(|value| {
914                        value
915                            .checked_mul(10)
916                            .and_then(|value| value.checked_add(u64::from(digit - b'0')))
917                    });
918                    self.index += 1;
919                }
920            }
921            _ => return Err(self.error("invalid number")),
922        }
923
924        let mut float = false;
925        if self.input.get(self.index) == Some(&b'.') {
926            float = true;
927            self.index += 1;
928            let fraction_start = self.index;
929            while self.input.get(self.index).is_some_and(u8::is_ascii_digit) {
930                self.index += 1;
931            }
932            if self.index == fraction_start {
933                return Err(self.error("fraction has no digits"));
934            }
935        }
936
937        if matches!(self.input.get(self.index), Some(b'e' | b'E')) {
938            float = true;
939            self.index += 1;
940            if matches!(self.input.get(self.index), Some(b'+' | b'-')) {
941                self.index += 1;
942            }
943            let exponent_start = self.index;
944            while self.input.get(self.index).is_some_and(u8::is_ascii_digit) {
945                self.index += 1;
946            }
947            if self.index == exponent_start {
948                return Err(self.error("exponent has no digits"));
949            }
950        }
951
952        let raw = str::from_utf8(&self.input[start..self.index])
953            .map_err(|_| self.error("number is not ASCII"))?;
954        Ok(ParsedNumber {
955            raw,
956            float,
957            negative,
958            magnitude,
959        })
960    }
961
962    #[inline]
963    fn parse_u64_value(&mut self) -> Result<u64> {
964        self.skip_whitespace();
965        let first = self
966            .input
967            .get(self.index)
968            .copied()
969            .ok_or_else(|| self.error("invalid number"))?;
970        if first == b'-' {
971            return Err(self.error("expected an unsigned integer"));
972        }
973
974        let mut value = match first {
975            b'0' => 0,
976            b'1'..=b'9' => u64::from(first - b'0'),
977            _ => return Err(self.error("invalid number")),
978        };
979        self.index += 1;
980
981        if first == b'0' && self.input.get(self.index).is_some_and(u8::is_ascii_digit) {
982            return Err(self.error("leading zero in number"));
983        }
984
985        while let Some(digit @ b'0'..=b'9') = self.input.get(self.index).copied() {
986            value = value
987                .checked_mul(10)
988                .and_then(|value| value.checked_add(u64::from(digit - b'0')))
989                .ok_or_else(|| self.error("integer is out of range"))?;
990            self.index += 1;
991        }
992
993        if matches!(self.input.get(self.index), Some(b'.' | b'e' | b'E')) {
994            return Err(self.error("expected an unsigned integer"));
995        }
996        Ok(value)
997    }
998
999    #[inline]
1000    fn parse_i64_value(&mut self) -> Result<i64> {
1001        self.skip_whitespace();
1002        let negative = self.input.get(self.index) == Some(&b'-');
1003        if negative {
1004            self.index += 1;
1005        }
1006        let first = self
1007            .input
1008            .get(self.index)
1009            .copied()
1010            .ok_or_else(|| self.error("invalid number"))?;
1011
1012        let mut magnitude = match first {
1013            b'0' => 0,
1014            b'1'..=b'9' => u64::from(first - b'0'),
1015            _ => return Err(self.error("invalid number")),
1016        };
1017        self.index += 1;
1018
1019        if first == b'0' && self.input.get(self.index).is_some_and(u8::is_ascii_digit) {
1020            return Err(self.error("leading zero in number"));
1021        }
1022        while let Some(digit @ b'0'..=b'9') = self.input.get(self.index).copied() {
1023            magnitude = magnitude
1024                .checked_mul(10)
1025                .and_then(|value| value.checked_add(u64::from(digit - b'0')))
1026                .ok_or_else(|| self.error("integer is out of range"))?;
1027            self.index += 1;
1028        }
1029        if matches!(self.input.get(self.index), Some(b'.' | b'e' | b'E')) {
1030            return Err(self.error("expected an integer"));
1031        }
1032
1033        if negative {
1034            if magnitude == (i64::MAX as u64) + 1 {
1035                Ok(i64::MIN)
1036            } else {
1037                i64::try_from(magnitude)
1038                    .map(|value| -value)
1039                    .map_err(|_| self.error("integer is out of range"))
1040            }
1041        } else {
1042            i64::try_from(magnitude).map_err(|_| self.error("integer is out of range"))
1043        }
1044    }
1045
1046    #[inline]
1047    fn numeric_start(&mut self) -> Result<usize> {
1048        self.skip_whitespace();
1049        let start = self.index;
1050        let unsigned_start = if self.input.get(start) == Some(&b'-') {
1051            start + 1
1052        } else {
1053            start
1054        };
1055        let first = self
1056            .input
1057            .get(unsigned_start)
1058            .copied()
1059            .ok_or_else(|| self.error("invalid number"))?;
1060        if !first.is_ascii_digit() {
1061            return Err(self.error("invalid number"));
1062        }
1063        if first == b'0'
1064            && self
1065                .input
1066                .get(unsigned_start + 1)
1067                .is_some_and(u8::is_ascii_digit)
1068        {
1069            return Err(self.error("leading zero in number"));
1070        }
1071        Ok(start)
1072    }
1073
1074    #[inline]
1075    fn parse_f32_value(&mut self) -> Result<f32> {
1076        let start = self.numeric_start()?;
1077        let (value, consumed) =
1078            lexical_core::parse_partial_with_options::<f32, { lexical_core::format::JSON }>(
1079                &self.input[start..],
1080                &lexical_core::parse_float_options::JSON,
1081            )
1082            .map_err(|_| self.error("number is out of range"))?;
1083        self.index = start + consumed;
1084        if value.is_finite() {
1085            Ok(value)
1086        } else {
1087            Err(self.error("number is out of range"))
1088        }
1089    }
1090
1091    #[inline]
1092    fn parse_f64_value(&mut self) -> Result<f64> {
1093        let start = self.numeric_start()?;
1094        let (value, consumed) =
1095            lexical_core::parse_partial_with_options::<f64, { lexical_core::format::JSON }>(
1096                &self.input[start..],
1097                &lexical_core::parse_float_options::JSON,
1098            )
1099            .map_err(|_| self.error("number is out of range"))?;
1100        self.index = start + consumed;
1101        if value.is_finite() {
1102            Ok(value)
1103        } else {
1104            Err(self.error("number is out of range"))
1105        }
1106    }
1107}
1108
1109fn hex_value(byte: u8) -> Option<u8> {
1110    match byte {
1111        b'0'..=b'9' => Some(byte - b'0'),
1112        b'a'..=b'f' => Some(byte - b'a' + 10),
1113        b'A'..=b'F' => Some(byte - b'A' + 10),
1114        _ => None,
1115    }
1116}
1117
1118#[derive(Clone, Copy)]
1119struct ParsedNumber<'de> {
1120    raw: &'de str,
1121    float: bool,
1122    negative: bool,
1123    magnitude: Option<u64>,
1124}
1125
1126impl ParsedNumber<'_> {
1127    fn visit_any<'de, V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1128        if self.float || self.raw == "-0" {
1129            let value = lexical_core::parse_with_options::<f64, { lexical_core::format::JSON }>(
1130                self.raw.as_bytes(),
1131                &lexical_core::parse_float_options::JSON,
1132            )
1133            .map_err(|_| Error::message("number is out of range"))?;
1134            if !value.is_finite() {
1135                return Err(Error::message("number is out of range"));
1136            }
1137            return visitor.visit_f64(value);
1138        }
1139        if self.negative {
1140            self.checked_i64()
1141                .ok_or_else(|| Error::message("integer is out of range"))
1142                .and_then(|value| visitor.visit_i64(value))
1143        } else {
1144            self.magnitude
1145                .ok_or_else(|| Error::message("integer is out of range"))
1146                .and_then(|value| visitor.visit_u64(value))
1147        }
1148    }
1149
1150    #[inline]
1151    fn checked_i64(&self) -> Option<i64> {
1152        let magnitude = self.magnitude?;
1153        if self.negative {
1154            if magnitude == (i64::MAX as u64) + 1 {
1155                Some(i64::MIN)
1156            } else {
1157                i64::try_from(magnitude).ok().map(|value| -value)
1158            }
1159        } else {
1160            i64::try_from(magnitude).ok()
1161        }
1162    }
1163}
1164
1165/// Deserializes one complete JSON value from a byte slice.
1166///
1167/// # Errors
1168///
1169/// Returns an error for malformed JSON, trailing data, or a Serde type mismatch.
1170#[inline]
1171pub fn from_slice<'de, T: Deserialize<'de>>(input: &'de [u8]) -> Result<T> {
1172    let mut deserializer = Deserializer::from_slice(input);
1173    let value = T::deserialize(&mut deserializer)?;
1174    deserializer.end()?;
1175    Ok(value)
1176}
1177
1178/// Deserializes one complete JSON value from a string.
1179///
1180/// # Errors
1181///
1182/// Returns an error for malformed JSON, trailing data, or a Serde type mismatch.
1183#[inline]
1184pub fn from_str<'de, T: Deserialize<'de>>(input: &'de str) -> Result<T> {
1185    let mut deserializer = Deserializer::from_str(input);
1186    let value = T::deserialize(&mut deserializer)?;
1187    deserializer.end()?;
1188    Ok(value)
1189}
1190
1191impl<'de> de::Deserializer<'de> for &mut Deserializer<'de> {
1192    type Error = Error;
1193
1194    #[inline]
1195    fn deserialize_any<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1196        match self.peek() {
1197            Some(b'n') => {
1198                self.parse_literal(b"null")?;
1199                visitor.visit_unit()
1200            }
1201            Some(b't') => {
1202                self.parse_literal(b"true")?;
1203                visitor.visit_bool(true)
1204            }
1205            Some(b'f') => {
1206                self.parse_literal(b"false")?;
1207                visitor.visit_bool(false)
1208            }
1209            Some(b'"') => match self.parse_string()? {
1210                Cow::Borrowed(value) => visitor.visit_borrowed_str(value),
1211                Cow::Owned(value) => visitor.visit_string(value),
1212            },
1213            Some(b'[') => self.deserialize_seq(visitor),
1214            Some(b'{') => self.deserialize_map(visitor),
1215            Some(b'-' | b'0'..=b'9') => self.parse_number()?.visit_any(visitor),
1216            Some(_) => Err(self.error("expected a JSON value")),
1217            None => Err(self.error("unexpected end of input")),
1218        }
1219    }
1220
1221    #[inline]
1222    fn deserialize_bool<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1223        match self.peek() {
1224            Some(b't') => {
1225                self.parse_literal(b"true")?;
1226                visitor.visit_bool(true)
1227            }
1228            Some(b'f') => {
1229                self.parse_literal(b"false")?;
1230                visitor.visit_bool(false)
1231            }
1232            _ => Err(self.error("expected a boolean")),
1233        }
1234    }
1235
1236    fn deserialize_i8<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1237        visitor.visit_i8(
1238            i8::try_from(self.parse_i64_value()?)
1239                .map_err(|_| self.error("integer is out of range"))?,
1240        )
1241    }
1242
1243    fn deserialize_i16<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1244        visitor.visit_i16(
1245            i16::try_from(self.parse_i64_value()?)
1246                .map_err(|_| self.error("integer is out of range"))?,
1247        )
1248    }
1249
1250    fn deserialize_i32<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1251        visitor.visit_i32(
1252            i32::try_from(self.parse_i64_value()?)
1253                .map_err(|_| self.error("integer is out of range"))?,
1254        )
1255    }
1256
1257    #[inline]
1258    fn deserialize_i64<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1259        visitor.visit_i64(self.parse_i64_value()?)
1260    }
1261
1262    fn deserialize_i128<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1263        visitor.visit_i128(self.parse_integer()?)
1264    }
1265
1266    fn deserialize_u8<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1267        visitor.visit_u8(
1268            u8::try_from(self.parse_u64_value()?)
1269                .map_err(|_| self.error("integer is out of range"))?,
1270        )
1271    }
1272
1273    fn deserialize_u16<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1274        visitor.visit_u16(
1275            u16::try_from(self.parse_u64_value()?)
1276                .map_err(|_| self.error("integer is out of range"))?,
1277        )
1278    }
1279
1280    fn deserialize_u32<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1281        visitor.visit_u32(
1282            u32::try_from(self.parse_u64_value()?)
1283                .map_err(|_| self.error("integer is out of range"))?,
1284        )
1285    }
1286
1287    #[inline]
1288    fn deserialize_u64<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1289        visitor.visit_u64(self.parse_u64_value()?)
1290    }
1291
1292    fn deserialize_u128<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1293        visitor.visit_u128(self.parse_unsigned()?)
1294    }
1295
1296    fn deserialize_f32<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1297        visitor.visit_f32(self.parse_f32_value()?)
1298    }
1299
1300    #[inline]
1301    fn deserialize_f64<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1302        visitor.visit_f64(self.parse_f64_value()?)
1303    }
1304
1305    fn deserialize_char<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1306        let value = self.parse_string()?;
1307        let mut characters = value.chars();
1308        let character = characters
1309            .next()
1310            .ok_or_else(|| self.error("expected one character"))?;
1311        if characters.next().is_some() {
1312            return Err(self.error("expected one character"));
1313        }
1314        visitor.visit_char(character)
1315    }
1316
1317    #[inline]
1318    fn deserialize_str<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1319        match self.parse_string()? {
1320            Cow::Borrowed(value) => visitor.visit_borrowed_str(value),
1321            Cow::Owned(value) => visitor.visit_string(value),
1322        }
1323    }
1324
1325    #[inline]
1326    fn deserialize_string<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1327        match self.parse_string()? {
1328            Cow::Borrowed(value) => visitor.visit_str(value),
1329            Cow::Owned(value) => visitor.visit_string(value),
1330        }
1331    }
1332
1333    fn deserialize_bytes<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1334        self.deserialize_seq(visitor)
1335    }
1336
1337    fn deserialize_byte_buf<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1338        self.deserialize_seq(visitor)
1339    }
1340
1341    #[inline]
1342    fn deserialize_option<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1343        if self.peek() == Some(b'n') {
1344            self.parse_literal(b"null")?;
1345            visitor.visit_none()
1346        } else {
1347            visitor.visit_some(self)
1348        }
1349    }
1350
1351    fn deserialize_unit<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1352        self.parse_literal(b"null")?;
1353        visitor.visit_unit()
1354    }
1355
1356    fn deserialize_unit_struct<V: Visitor<'de>>(
1357        self,
1358        _name: &'static str,
1359        visitor: V,
1360    ) -> Result<V::Value> {
1361        self.deserialize_unit(visitor)
1362    }
1363
1364    fn deserialize_newtype_struct<V: Visitor<'de>>(
1365        self,
1366        name: &'static str,
1367        visitor: V,
1368    ) -> Result<V::Value> {
1369        if name == RAW_JSON_TOKEN {
1370            visitor.visit_borrowed_str(self.capture_raw()?)
1371        } else if name == RAW_VALUE_TOKEN {
1372            let raw = self.capture_raw()?;
1373            visitor.visit_map(BorrowedRawMap::new(raw))
1374        } else {
1375            visitor.visit_newtype_struct(self)
1376        }
1377    }
1378
1379    #[inline]
1380    fn deserialize_seq<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1381        self.expect_byte(b'[')?;
1382        self.enter()?;
1383        let value = visitor.visit_seq(SliceSeqAccess {
1384            deserializer: self,
1385            first: true,
1386            finished: false,
1387        });
1388        if value.is_err() {
1389            self.leave();
1390        }
1391        value
1392    }
1393
1394    fn deserialize_tuple<V: Visitor<'de>>(self, _length: usize, visitor: V) -> Result<V::Value> {
1395        self.deserialize_seq(visitor)
1396    }
1397
1398    fn deserialize_tuple_struct<V: Visitor<'de>>(
1399        self,
1400        _name: &'static str,
1401        length: usize,
1402        visitor: V,
1403    ) -> Result<V::Value> {
1404        self.deserialize_tuple(length, visitor)
1405    }
1406
1407    #[inline]
1408    fn deserialize_map<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1409        self.expect_byte(b'{')?;
1410        self.enter()?;
1411        let value = visitor.visit_map(SliceMapAccess {
1412            deserializer: self,
1413            first: true,
1414            finished: false,
1415            value_pending: false,
1416        });
1417        if value.is_err() {
1418            self.leave();
1419        }
1420        value
1421    }
1422
1423    #[inline]
1424    fn deserialize_struct<V: Visitor<'de>>(
1425        self,
1426        _name: &'static str,
1427        _fields: &'static [&'static str],
1428        visitor: V,
1429    ) -> Result<V::Value> {
1430        self.deserialize_map(visitor)
1431    }
1432
1433    fn deserialize_enum<V: Visitor<'de>>(
1434        self,
1435        _name: &'static str,
1436        _variants: &'static [&'static str],
1437        visitor: V,
1438    ) -> Result<V::Value> {
1439        match self.peek() {
1440            Some(b'"') => match self.parse_string()? {
1441                Cow::Borrowed(value) => visitor.visit_enum(value.into_deserializer()),
1442                Cow::Owned(value) => visitor.visit_enum(value.into_deserializer()),
1443            },
1444            Some(b'{') => {
1445                self.expect_byte(b'{')?;
1446                self.enter()?;
1447                visitor.visit_enum(SliceEnumAccess { deserializer: self })
1448            }
1449            _ => Err(self.error("expected an enum string or object")),
1450        }
1451    }
1452
1453    fn deserialize_identifier<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1454        self.deserialize_str(visitor)
1455    }
1456
1457    fn deserialize_ignored_any<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1458        self.skip_value()?;
1459        visitor.visit_unit()
1460    }
1461}
1462
1463impl Deserializer<'_> {
1464    fn parse_integer<T: str::FromStr>(&mut self) -> Result<T> {
1465        let number = self.parse_number()?;
1466        if number.float {
1467            return Err(self.error("expected an integer"));
1468        }
1469        number
1470            .raw
1471            .parse()
1472            .map_err(|_| self.error("integer is out of range"))
1473    }
1474
1475    fn parse_unsigned<T: str::FromStr>(&mut self) -> Result<T> {
1476        let number = self.parse_number()?;
1477        if number.float || number.raw.starts_with('-') {
1478            return Err(self.error("expected an unsigned integer"));
1479        }
1480        number
1481            .raw
1482            .parse()
1483            .map_err(|_| self.error("integer is out of range"))
1484    }
1485}
1486
1487struct SliceSeqAccess<'a, 'de> {
1488    deserializer: &'a mut Deserializer<'de>,
1489    first: bool,
1490    finished: bool,
1491}
1492
1493impl<'de> SeqAccess<'de> for SliceSeqAccess<'_, 'de> {
1494    type Error = Error;
1495
1496    fn next_element_seed<T: DeserializeSeed<'de>>(&mut self, seed: T) -> Result<Option<T::Value>> {
1497        if self.finished {
1498            return Ok(None);
1499        }
1500        self.deserializer.skip_whitespace();
1501        if self.deserializer.input.get(self.deserializer.index) == Some(&b']') {
1502            self.deserializer.index += 1;
1503            self.deserializer.leave();
1504            self.finished = true;
1505            return Ok(None);
1506        }
1507        if !self.first {
1508            self.deserializer.expect_byte(b',')?;
1509            self.deserializer.skip_whitespace();
1510            if self.deserializer.input.get(self.deserializer.index) == Some(&b']') {
1511                return Err(self.deserializer.error("trailing comma in array"));
1512            }
1513        }
1514        self.first = false;
1515        seed.deserialize(&mut *self.deserializer).map(Some)
1516    }
1517}
1518
1519struct SliceMapAccess<'a, 'de> {
1520    deserializer: &'a mut Deserializer<'de>,
1521    first: bool,
1522    finished: bool,
1523    value_pending: bool,
1524}
1525
1526impl<'de> MapAccess<'de> for SliceMapAccess<'_, 'de> {
1527    type Error = Error;
1528
1529    fn next_key_seed<K: DeserializeSeed<'de>>(&mut self, seed: K) -> Result<Option<K::Value>> {
1530        if self.finished {
1531            return Ok(None);
1532        }
1533        if self.value_pending {
1534            return Err(self.deserializer.error("object value was not consumed"));
1535        }
1536        self.deserializer.skip_whitespace();
1537        if self.deserializer.input.get(self.deserializer.index) == Some(&b'}') {
1538            self.deserializer.index += 1;
1539            self.deserializer.leave();
1540            self.finished = true;
1541            return Ok(None);
1542        }
1543        if !self.first {
1544            self.deserializer.expect_byte(b',')?;
1545            self.deserializer.skip_whitespace();
1546            if self.deserializer.input.get(self.deserializer.index) == Some(&b'}') {
1547                return Err(self.deserializer.error("trailing comma in object"));
1548            }
1549        }
1550        self.first = false;
1551        let key = self.deserializer.parse_string()?;
1552        self.deserializer.expect_byte(b':')?;
1553        self.value_pending = true;
1554        seed.deserialize(KeyDeserializer { key }).map(Some)
1555    }
1556
1557    fn next_value_seed<V: DeserializeSeed<'de>>(&mut self, seed: V) -> Result<V::Value> {
1558        if !self.value_pending {
1559            return Err(self.deserializer.error("object key was not consumed"));
1560        }
1561        self.value_pending = false;
1562        seed.deserialize(&mut *self.deserializer)
1563    }
1564}
1565
1566struct KeyDeserializer<'de> {
1567    key: Cow<'de, str>,
1568}
1569
1570macro_rules! deserialize_key_number {
1571    ($method:ident, $visit:ident, $type:ty) => {
1572        fn $method<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1573            let value = self
1574                .key
1575                .parse::<$type>()
1576                .map_err(|_| Error::message("object key is not the requested number"))?;
1577            visitor.$visit(value)
1578        }
1579    };
1580}
1581
1582impl<'de> de::Deserializer<'de> for KeyDeserializer<'de> {
1583    type Error = Error;
1584
1585    fn deserialize_any<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1586        match self.key {
1587            Cow::Borrowed(key) => visitor.visit_borrowed_str(key),
1588            Cow::Owned(key) => visitor.visit_string(key),
1589        }
1590    }
1591
1592    fn deserialize_bool<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1593        match self.key.as_ref() {
1594            "true" => visitor.visit_bool(true),
1595            "false" => visitor.visit_bool(false),
1596            _ => Err(Error::message("object key is not a boolean")),
1597        }
1598    }
1599
1600    deserialize_key_number!(deserialize_i8, visit_i8, i8);
1601    deserialize_key_number!(deserialize_i16, visit_i16, i16);
1602    deserialize_key_number!(deserialize_i32, visit_i32, i32);
1603    deserialize_key_number!(deserialize_i64, visit_i64, i64);
1604    deserialize_key_number!(deserialize_i128, visit_i128, i128);
1605    deserialize_key_number!(deserialize_u8, visit_u8, u8);
1606    deserialize_key_number!(deserialize_u16, visit_u16, u16);
1607    deserialize_key_number!(deserialize_u32, visit_u32, u32);
1608    deserialize_key_number!(deserialize_u64, visit_u64, u64);
1609    deserialize_key_number!(deserialize_u128, visit_u128, u128);
1610
1611    fn deserialize_char<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1612        let mut characters = self.key.chars();
1613        let value = characters
1614            .next()
1615            .ok_or_else(|| Error::message("object key is not a character"))?;
1616        if characters.next().is_some() {
1617            return Err(Error::message("object key is not a character"));
1618        }
1619        visitor.visit_char(value)
1620    }
1621
1622    fn deserialize_str<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1623        self.deserialize_any(visitor)
1624    }
1625
1626    fn deserialize_string<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1627        self.deserialize_any(visitor)
1628    }
1629
1630    fn deserialize_enum<V: Visitor<'de>>(
1631        self,
1632        _name: &'static str,
1633        _variants: &'static [&'static str],
1634        visitor: V,
1635    ) -> Result<V::Value> {
1636        visitor.visit_enum(self.key.into_deserializer())
1637    }
1638
1639    fn deserialize_identifier<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1640        self.deserialize_any(visitor)
1641    }
1642
1643    fn deserialize_ignored_any<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
1644        self.deserialize_any(visitor)
1645    }
1646
1647    serde::forward_to_deserialize_any! {
1648        f32 f64 bytes byte_buf option unit unit_struct newtype_struct seq tuple tuple_struct
1649        map struct
1650    }
1651}
1652
1653struct SliceEnumAccess<'a, 'de> {
1654    deserializer: &'a mut Deserializer<'de>,
1655}
1656
1657impl<'de, 'a> EnumAccess<'de> for SliceEnumAccess<'a, 'de> {
1658    type Error = Error;
1659    type Variant = SliceVariantAccess<'a, 'de>;
1660
1661    fn variant_seed<V: DeserializeSeed<'de>>(self, seed: V) -> Result<(V::Value, Self::Variant)> {
1662        let key = self.deserializer.parse_string()?;
1663        self.deserializer.expect_byte(b':')?;
1664        let value = seed.deserialize(KeyDeserializer { key })?;
1665        Ok((
1666            value,
1667            SliceVariantAccess {
1668                deserializer: self.deserializer,
1669            },
1670        ))
1671    }
1672}
1673
1674struct SliceVariantAccess<'a, 'de> {
1675    deserializer: &'a mut Deserializer<'de>,
1676}
1677
1678impl SliceVariantAccess<'_, '_> {
1679    fn finish(self) -> Result<()> {
1680        self.deserializer.expect_byte(b'}')?;
1681        self.deserializer.leave();
1682        Ok(())
1683    }
1684}
1685
1686impl<'de> VariantAccess<'de> for SliceVariantAccess<'_, 'de> {
1687    type Error = Error;
1688
1689    fn unit_variant(self) -> Result<()> {
1690        self.deserializer.parse_literal(b"null")?;
1691        self.finish()
1692    }
1693
1694    fn newtype_variant_seed<T: DeserializeSeed<'de>>(self, seed: T) -> Result<T::Value> {
1695        let value = seed.deserialize(&mut *self.deserializer)?;
1696        self.finish()?;
1697        Ok(value)
1698    }
1699
1700    fn tuple_variant<V: Visitor<'de>>(self, length: usize, visitor: V) -> Result<V::Value> {
1701        let value = de::Deserializer::deserialize_tuple(&mut *self.deserializer, length, visitor)?;
1702        self.finish()?;
1703        Ok(value)
1704    }
1705
1706    fn struct_variant<V: Visitor<'de>>(
1707        self,
1708        fields: &'static [&'static str],
1709        visitor: V,
1710    ) -> Result<V::Value> {
1711        let value =
1712            de::Deserializer::deserialize_struct(&mut *self.deserializer, "", fields, visitor)?;
1713        self.finish()?;
1714        Ok(value)
1715    }
1716}
1717
1718impl fmt::Debug for Deserializer<'_> {
1719    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
1720        formatter
1721            .debug_struct("Deserializer")
1722            .field("index", &self.index)
1723            .field("remaining", &self.input.len().saturating_sub(self.index))
1724            .finish()
1725    }
1726}