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
221pub struct Deserializer<'de> {
223 input: &'de [u8],
224 source: Option<&'de str>,
225 index: usize,
226 depth: usize,
227}
228
229pub struct JsonCursor<'de> {
235 deserializer: Deserializer<'de>,
236}
237
238pub struct Object<'cursor, 'de> {
240 deserializer: &'cursor mut Deserializer<'de>,
241 first: bool,
242 finished: bool,
243}
244
245pub struct Field<'cursor, 'de> {
248 name: Cow<'de, str>,
249 deserializer: &'cursor mut Deserializer<'de>,
250}
251
252impl<'de> JsonCursor<'de> {
253 #[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 #[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 #[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 #[inline]
294 pub fn end(&mut self) -> Result<()> {
295 self.deserializer.end()
296 }
297}
298
299impl<'de> Object<'_, 'de> {
300 #[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 #[must_use]
353 #[inline]
354 pub fn name(&self) -> &str {
355 &self.name
356 }
357
358 #[inline]
364 pub fn skip(self) -> Result<()> {
365 self.deserializer.skip_value()
366 }
367
368 #[inline]
374 pub fn raw(self) -> Result<crate::RawJson<'de>> {
375 self.deserializer.capture_raw().map(crate::RawJson::new)
376 }
377
378 #[inline]
384 pub fn string(self) -> Result<Cow<'de, str>> {
385 self.deserializer.parse_string()
386 }
387
388 #[inline]
394 pub fn deserialize<T: Deserialize<'de>>(self) -> Result<T> {
395 T::deserialize(&mut *self.deserializer)
396 }
397
398 #[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 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#[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#[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}