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