1use serde::{
2 de::{
3 DeserializeSeed, EnumAccess, Expected, IntoDeserializer, MapAccess, SeqAccess, Unexpected,
4 VariantAccess, Visitor,
5 },
6 forward_to_deserialize_any, Deserialize,
7};
8use std::fmt;
9
10use crate::{
11 object::{Entry, Key},
12 Array, NumberBuf, Object, Value,
13};
14
15use super::NUMBER_TOKEN;
16
17impl Value {
18 #[cold]
19 fn invalid_type<E>(&self, exp: &dyn Expected) -> E
20 where
21 E: serde::de::Error,
22 {
23 serde::de::Error::invalid_type(self.unexpected(), exp)
24 }
25
26 #[cold]
27 fn unexpected(&self) -> Unexpected {
28 match self {
29 Self::Null => Unexpected::Unit,
30 Self::Boolean(b) => Unexpected::Bool(*b),
31 Self::Number(n) => match n.as_u64() {
32 Some(u) => Unexpected::Unsigned(u),
33 None => match n.as_i64() {
34 Some(i) => Unexpected::Signed(i),
35 None => Unexpected::Float(n.as_f64_lossy()),
36 },
37 },
38 Self::String(s) => Unexpected::Str(s),
39 Self::Array(_) => Unexpected::Seq,
40 Self::Object(_) => Unexpected::Map,
41 }
42 }
43}
44
45impl<'de> Deserialize<'de> for Value {
46 #[inline]
47 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
48 where
49 D: serde::Deserializer<'de>,
50 {
51 struct ValueVisitor;
52
53 impl<'de> Visitor<'de> for ValueVisitor {
54 type Value = Value;
55
56 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
57 formatter.write_str("any valid JSON value")
58 }
59
60 #[inline]
61 fn visit_bool<E>(self, value: bool) -> Result<Value, E> {
62 Ok(Value::Boolean(value))
63 }
64
65 #[inline]
66 fn visit_i64<E>(self, value: i64) -> Result<Value, E> {
67 Ok(Value::Number(value.into()))
68 }
69
70 #[inline]
71 fn visit_u64<E>(self, value: u64) -> Result<Value, E> {
72 Ok(Value::Number(value.into()))
73 }
74
75 #[inline]
76 fn visit_f64<E>(self, value: f64) -> Result<Value, E> {
77 Ok(NumberBuf::try_from(value).map_or(Value::Null, Value::Number))
78 }
79
80 #[inline]
81 fn visit_str<E>(self, value: &str) -> Result<Value, E>
82 where
83 E: serde::de::Error,
84 {
85 Ok(Value::String(value.into()))
86 }
87
88 #[inline]
89 fn visit_string<E>(self, value: String) -> Result<Value, E> {
90 Ok(Value::String(value.into()))
91 }
92
93 #[inline]
94 fn visit_none<E>(self) -> Result<Value, E> {
95 Ok(Value::Null)
96 }
97
98 #[inline]
99 fn visit_some<D>(self, deserializer: D) -> Result<Value, D::Error>
100 where
101 D: serde::Deserializer<'de>,
102 {
103 Deserialize::deserialize(deserializer)
104 }
105
106 #[inline]
107 fn visit_unit<E>(self) -> Result<Value, E> {
108 Ok(Value::Null)
109 }
110
111 #[inline]
112 fn visit_seq<V>(self, mut visitor: V) -> Result<Value, V::Error>
113 where
114 V: SeqAccess<'de>,
115 {
116 let mut vec = Vec::new();
117
118 while let Some(elem) = visitor.next_element()? {
119 vec.push(elem);
120 }
121
122 Ok(Value::Array(vec))
123 }
124
125 fn visit_map<V>(self, mut visitor: V) -> Result<Value, V::Error>
126 where
127 V: MapAccess<'de>,
128 {
129 enum MapTag {
130 Number,
131 None(Key),
132 }
133
134 impl<'de> Deserialize<'de> for MapTag {
135 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
136 where
137 D: serde::Deserializer<'de>,
138 {
139 struct Visitor;
140
141 impl<'de> serde::de::Visitor<'de> for Visitor {
142 type Value = MapTag;
143
144 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
145 formatter.write_str("a string key")
146 }
147
148 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
149 where
150 E: serde::de::Error,
151 {
152 if v == NUMBER_TOKEN {
153 Ok(MapTag::Number)
154 } else {
155 Ok(MapTag::None(v.into()))
156 }
157 }
158
159 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
160 where
161 E: serde::de::Error,
162 {
163 if v == NUMBER_TOKEN {
164 Ok(MapTag::Number)
165 } else {
166 Ok(MapTag::None(v.into()))
167 }
168 }
169 }
170
171 deserializer.deserialize_string(Visitor)
172 }
173 }
174
175 match visitor.next_key()? {
176 Some(MapTag::Number) => {
177 let value: String = visitor.next_value()?;
178 NumberBuf::new(value.into_bytes().into())
179 .map(Value::Number)
180 .map_err(|json_number::InvalidNumber(bytes)| {
181 serde::de::Error::custom(json_number::InvalidNumber(
182 String::from_utf8(bytes.into_vec()).unwrap(),
183 ))
184 })
185 }
186 Some(MapTag::None(key)) => {
187 let mut object = Object::new();
188
189 object.insert(key, visitor.next_value()?);
190 while let Some((key, value)) = visitor.next_entry()? {
191 object.insert(key, value);
192 }
193
194 Ok(Value::Object(object))
195 }
196 None => Ok(Value::Object(Object::new())),
197 }
198 }
199 }
200
201 deserializer.deserialize_any(ValueVisitor)
202 }
203}
204
205impl<'de> IntoDeserializer<'de, DeserializeError> for Value {
206 type Deserializer = Self;
207
208 fn into_deserializer(self) -> Self::Deserializer {
209 self
210 }
211}
212
213impl<'de> Deserialize<'de> for Object {
214 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
215 where
216 D: serde::Deserializer<'de>,
217 {
218 struct Visitor;
219
220 impl<'de> serde::de::Visitor<'de> for Visitor {
221 type Value = Object;
222
223 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
224 write!(formatter, "a JSON object")
225 }
226
227 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
228 where
229 A: MapAccess<'de>,
230 {
231 let mut object = Object::new();
232
233 while let Some((key, value)) = map.next_entry()? {
234 object.insert(key, value);
235 }
236
237 Ok(object)
238 }
239 }
240
241 deserializer.deserialize_map(Visitor)
242 }
243}
244
245impl<'de> IntoDeserializer<'de, DeserializeError> for Object {
246 type Deserializer = Value;
247
248 fn into_deserializer(self) -> Self::Deserializer {
249 Value::Object(self)
250 }
251}
252
253#[derive(Debug, Clone)]
254pub enum DeserializeError {
255 Custom(String),
256 NonStringKey,
257}
258
259impl fmt::Display for DeserializeError {
260 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
261 match self {
262 Self::Custom(msg) => msg.fmt(f),
263 Self::NonStringKey => write!(f, "key must be a string"),
264 }
265 }
266}
267
268impl From<json_number::serde::Unexpected> for DeserializeError {
269 fn from(value: json_number::serde::Unexpected) -> Self {
270 Self::Custom(value.to_string())
271 }
272}
273
274impl std::error::Error for DeserializeError {}
275
276impl serde::de::Error for DeserializeError {
277 fn custom<T>(msg: T) -> Self
278 where
279 T: fmt::Display,
280 {
281 Self::Custom(msg.to_string())
282 }
283}
284
285macro_rules! deserialize_number {
286 ($method:ident) => {
287 fn $method<V>(self, visitor: V) -> Result<V::Value, Self::Error>
288 where
289 V: serde::de::Visitor<'de>,
290 {
291 match self {
292 Value::Number(n) => Ok(n.deserialize_any(visitor)?),
293 _ => Err(self.invalid_type(&visitor)),
294 }
295 }
296 };
297}
298
299impl<'de> serde::Deserializer<'de> for Value {
300 type Error = DeserializeError;
301
302 #[inline]
303 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
304 where
305 V: serde::de::Visitor<'de>,
306 {
307 match self {
308 Self::Null => visitor.visit_unit(),
309 Self::Boolean(v) => visitor.visit_bool(v),
310 Self::Number(n) => Ok(n.deserialize_any(visitor)?),
311 Self::String(s) => visitor.visit_string(s.into_string()),
312 Self::Array(a) => visit_array(a, visitor),
313 Self::Object(o) => visit_object(o, visitor),
314 }
315 }
316
317 deserialize_number!(deserialize_i8);
318 deserialize_number!(deserialize_i16);
319 deserialize_number!(deserialize_i32);
320 deserialize_number!(deserialize_i64);
321 deserialize_number!(deserialize_i128);
322 deserialize_number!(deserialize_u8);
323 deserialize_number!(deserialize_u16);
324 deserialize_number!(deserialize_u32);
325 deserialize_number!(deserialize_u64);
326 deserialize_number!(deserialize_u128);
327 deserialize_number!(deserialize_f32);
328 deserialize_number!(deserialize_f64);
329
330 #[inline]
331 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
332 where
333 V: serde::de::Visitor<'de>,
334 {
335 match self {
336 Value::Null => visitor.visit_none(),
337 _ => visitor.visit_some(self),
338 }
339 }
340
341 #[inline]
342 fn deserialize_enum<V>(
343 self,
344 _name: &str,
345 _variants: &'static [&'static str],
346 visitor: V,
347 ) -> Result<V::Value, Self::Error>
348 where
349 V: serde::de::Visitor<'de>,
350 {
351 let (variant, value) = match self {
352 Value::Object(value) => {
353 let mut iter = value.into_iter();
354 let Entry {
355 key: variant,
356 value,
357 } = match iter.next() {
358 Some(v) => v,
359 None => {
360 return Err(serde::de::Error::invalid_value(
361 Unexpected::Map,
362 &"map with a single key",
363 ));
364 }
365 };
366 if iter.next().is_some() {
368 return Err(serde::de::Error::invalid_value(
369 Unexpected::Map,
370 &"map with a single key",
371 ));
372 }
373 (variant, Some(value))
374 }
375 Value::String(variant) => (variant, None),
376 other => {
377 return Err(serde::de::Error::invalid_type(
378 other.unexpected(),
379 &"string or map",
380 ));
381 }
382 };
383
384 visitor.visit_enum(EnumDeserializer { variant, value })
385 }
386
387 #[inline]
388 fn deserialize_newtype_struct<V>(
389 self,
390 _name: &'static str,
391 visitor: V,
392 ) -> Result<V::Value, Self::Error>
393 where
394 V: serde::de::Visitor<'de>,
395 {
396 visitor.visit_newtype_struct(self)
397 }
398
399 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
400 where
401 V: serde::de::Visitor<'de>,
402 {
403 match self {
404 Value::Boolean(v) => visitor.visit_bool(v),
405 _ => Err(self.invalid_type(&visitor)),
406 }
407 }
408
409 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
410 where
411 V: serde::de::Visitor<'de>,
412 {
413 self.deserialize_string(visitor)
414 }
415
416 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
417 where
418 V: serde::de::Visitor<'de>,
419 {
420 self.deserialize_string(visitor)
421 }
422
423 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
424 where
425 V: serde::de::Visitor<'de>,
426 {
427 match self {
428 Value::String(v) => visitor.visit_string(v.into_string()),
429 _ => Err(self.invalid_type(&visitor)),
430 }
431 }
432
433 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
434 where
435 V: serde::de::Visitor<'de>,
436 {
437 self.deserialize_byte_buf(visitor)
438 }
439
440 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
441 where
442 V: serde::de::Visitor<'de>,
443 {
444 match self {
445 Value::String(v) => visitor.visit_string(v.into_string()),
446 Value::Array(v) => visit_array(v, visitor),
447 _ => Err(self.invalid_type(&visitor)),
448 }
449 }
450
451 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
452 where
453 V: serde::de::Visitor<'de>,
454 {
455 match self {
456 Value::Null => visitor.visit_unit(),
457 _ => Err(self.invalid_type(&visitor)),
458 }
459 }
460
461 fn deserialize_unit_struct<V>(
462 self,
463 _name: &'static str,
464 visitor: V,
465 ) -> Result<V::Value, Self::Error>
466 where
467 V: serde::de::Visitor<'de>,
468 {
469 self.deserialize_unit(visitor)
470 }
471
472 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
473 where
474 V: serde::de::Visitor<'de>,
475 {
476 match self {
477 Value::Array(v) => visit_array(v, visitor),
478 _ => Err(self.invalid_type(&visitor)),
479 }
480 }
481
482 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
483 where
484 V: serde::de::Visitor<'de>,
485 {
486 self.deserialize_seq(visitor)
487 }
488
489 fn deserialize_tuple_struct<V>(
490 self,
491 _name: &'static str,
492 _len: usize,
493 visitor: V,
494 ) -> Result<V::Value, Self::Error>
495 where
496 V: serde::de::Visitor<'de>,
497 {
498 self.deserialize_seq(visitor)
499 }
500
501 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
502 where
503 V: serde::de::Visitor<'de>,
504 {
505 match self {
506 Value::Object(v) => visit_object(v, visitor),
507 _ => Err(self.invalid_type(&visitor)),
508 }
509 }
510
511 fn deserialize_struct<V>(
512 self,
513 _name: &'static str,
514 _fields: &'static [&'static str],
515 visitor: V,
516 ) -> Result<V::Value, Self::Error>
517 where
518 V: serde::de::Visitor<'de>,
519 {
520 match self {
521 Value::Array(v) => visit_array(v, visitor),
522 Value::Object(v) => visit_object(v, visitor),
523 _ => Err(self.invalid_type(&visitor)),
524 }
525 }
526
527 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
528 where
529 V: serde::de::Visitor<'de>,
530 {
531 self.deserialize_string(visitor)
532 }
533
534 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
535 where
536 V: serde::de::Visitor<'de>,
537 {
538 drop(self);
539 visitor.visit_unit()
540 }
541}
542
543fn visit_array<'de, V>(a: Array, visitor: V) -> Result<V::Value, DeserializeError>
544where
545 V: serde::de::Visitor<'de>,
546{
547 let len = a.len();
548 let mut deserializer = ArrayDeserializer::new(a);
549 let seq = visitor.visit_seq(&mut deserializer)?;
550 let remaining = deserializer.iter.len();
551 if remaining == 0 {
552 Ok(seq)
553 } else {
554 Err(serde::de::Error::invalid_length(
555 len,
556 &"fewer elements in array",
557 ))
558 }
559}
560
561fn visit_object<'de, V>(o: Object, visitor: V) -> Result<V::Value, DeserializeError>
562where
563 V: serde::de::Visitor<'de>,
564{
565 let len = o.len();
566 let mut deserializer = ObjectDeserializer::new(o);
567 let map = visitor.visit_map(&mut deserializer)?;
568 let remaining = deserializer.iter.len();
569 if remaining == 0 {
570 Ok(map)
571 } else {
572 Err(serde::de::Error::invalid_length(
573 len,
574 &"fewer elements in map",
575 ))
576 }
577}
578
579struct ArrayDeserializer {
580 iter: std::vec::IntoIter<Value>,
581}
582
583impl ArrayDeserializer {
584 fn new(array: Array) -> Self {
585 Self {
586 iter: array.into_iter(),
587 }
588 }
589}
590
591impl<'de> SeqAccess<'de> for ArrayDeserializer {
592 type Error = DeserializeError;
593
594 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
595 where
596 T: DeserializeSeed<'de>,
597 {
598 match self.iter.next() {
599 Some(value) => seed.deserialize(value).map(Some),
600 None => Ok(None),
601 }
602 }
603
604 fn size_hint(&self) -> Option<usize> {
605 match self.iter.size_hint() {
606 (lower, Some(upper)) if lower == upper => Some(upper),
607 _ => None,
608 }
609 }
610}
611
612struct ObjectDeserializer {
613 iter: std::vec::IntoIter<Entry>,
614 value: Option<Value>,
615}
616
617impl ObjectDeserializer {
618 fn new(obj: Object) -> Self {
619 Self {
620 iter: obj.into_iter(),
621 value: None,
622 }
623 }
624}
625
626impl<'de> MapAccess<'de> for ObjectDeserializer {
627 type Error = DeserializeError;
628
629 fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
630 where
631 T: DeserializeSeed<'de>,
632 {
633 match self.iter.next() {
634 Some(Entry { key, value }) => {
635 self.value = Some(value);
636 let key_de = MapKeyDeserializer { key };
637 seed.deserialize(key_de).map(Some)
638 }
639 None => Ok(None),
640 }
641 }
642
643 fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>
644 where
645 T: DeserializeSeed<'de>,
646 {
647 match self.value.take() {
648 Some(value) => seed.deserialize(value),
649 None => Err(serde::de::Error::custom("value is missing")),
650 }
651 }
652
653 fn size_hint(&self) -> Option<usize> {
654 match self.iter.size_hint() {
655 (lower, Some(upper)) if lower == upper => Some(upper),
656 _ => None,
657 }
658 }
659}
660
661struct MapKeyDeserializer {
662 key: Key,
663}
664
665macro_rules! deserialize_integer_key {
666 ($method:ident => $visit:ident) => {
667 fn $method<V>(self, visitor: V) -> Result<V::Value, Self::Error>
668 where
669 V: serde::de::Visitor<'de>,
670 {
671 match (self.key.parse(), self.key) {
672 (Ok(integer), _) => visitor.$visit(integer),
673 (Err(_), key) => visitor.visit_string(key.into_string()),
674 }
675 }
676 };
677}
678
679impl<'de> serde::Deserializer<'de> for MapKeyDeserializer {
680 type Error = DeserializeError;
681
682 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
683 where
684 V: serde::de::Visitor<'de>,
685 {
686 visitor.visit_string(self.key.into_string())
687 }
688
689 deserialize_integer_key!(deserialize_i8 => visit_i8);
690 deserialize_integer_key!(deserialize_i16 => visit_i16);
691 deserialize_integer_key!(deserialize_i32 => visit_i32);
692 deserialize_integer_key!(deserialize_i64 => visit_i64);
693 deserialize_integer_key!(deserialize_i128 => visit_i128);
694 deserialize_integer_key!(deserialize_u8 => visit_u8);
695 deserialize_integer_key!(deserialize_u16 => visit_u16);
696 deserialize_integer_key!(deserialize_u32 => visit_u32);
697 deserialize_integer_key!(deserialize_u64 => visit_u64);
698 deserialize_integer_key!(deserialize_u128 => visit_u128);
699
700 #[inline]
701 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
702 where
703 V: serde::de::Visitor<'de>,
704 {
705 visitor.visit_some(self)
707 }
708
709 #[inline]
710 fn deserialize_newtype_struct<V>(
711 self,
712 _name: &'static str,
713 visitor: V,
714 ) -> Result<V::Value, Self::Error>
715 where
716 V: serde::de::Visitor<'de>,
717 {
718 visitor.visit_newtype_struct(self)
719 }
720
721 fn deserialize_enum<V>(
722 self,
723 name: &'static str,
724 variants: &'static [&'static str],
725 visitor: V,
726 ) -> Result<V::Value, Self::Error>
727 where
728 V: serde::de::Visitor<'de>,
729 {
730 self.key
731 .into_deserializer()
732 .deserialize_enum(name, variants, visitor)
733 }
734
735 forward_to_deserialize_any! {
736 bool f32 f64 char str string bytes byte_buf unit unit_struct seq tuple
737 tuple_struct map struct identifier ignored_any
738 }
739}
740
741struct EnumDeserializer {
742 variant: Key,
743 value: Option<Value>,
744}
745
746impl<'de> EnumAccess<'de> for EnumDeserializer {
747 type Error = DeserializeError;
748 type Variant = VariantDeserializer;
749
750 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, VariantDeserializer), Self::Error>
751 where
752 V: DeserializeSeed<'de>,
753 {
754 let variant = self.variant.into_deserializer();
755 let visitor = VariantDeserializer { value: self.value };
756 seed.deserialize(variant).map(|v| (v, visitor))
757 }
758}
759
760struct VariantDeserializer {
761 value: Option<Value>,
762}
763
764impl<'de> VariantAccess<'de> for VariantDeserializer {
765 type Error = DeserializeError;
766
767 fn unit_variant(self) -> Result<(), Self::Error> {
768 match self.value {
769 Some(value) => serde::Deserialize::deserialize(value),
770 None => Ok(()),
771 }
772 }
773
774 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
775 where
776 T: DeserializeSeed<'de>,
777 {
778 match self.value {
779 Some(value) => seed.deserialize(value),
780 None => Err(serde::de::Error::invalid_type(
781 Unexpected::UnitVariant,
782 &"newtype variant",
783 )),
784 }
785 }
786
787 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
788 where
789 V: serde::de::Visitor<'de>,
790 {
791 match self.value {
792 Some(Value::Array(v)) => {
793 if v.is_empty() {
794 visitor.visit_unit()
795 } else {
796 visit_array(v, visitor)
797 }
798 }
799 Some(other) => Err(serde::de::Error::invalid_type(
800 other.unexpected(),
801 &"tuple variant",
802 )),
803 None => Err(serde::de::Error::invalid_type(
804 Unexpected::UnitVariant,
805 &"tuple variant",
806 )),
807 }
808 }
809
810 fn struct_variant<V>(
811 self,
812 _fields: &'static [&'static str],
813 visitor: V,
814 ) -> Result<V::Value, Self::Error>
815 where
816 V: serde::de::Visitor<'de>,
817 {
818 match self.value {
819 Some(Value::Object(v)) => visit_object(v, visitor),
820 Some(other) => Err(serde::de::Error::invalid_type(
821 other.unexpected(),
822 &"struct variant",
823 )),
824 None => Err(serde::de::Error::invalid_type(
825 Unexpected::UnitVariant,
826 &"struct variant",
827 )),
828 }
829 }
830}