1use core::fmt;
2use core::str::FromStr;
3use imbl::Vector;
4use serde::de::{
5 self, Deserialize, DeserializeSeed, EnumAccess, Expected, IntoDeserializer, MapAccess,
6 SeqAccess, Unexpected, VariantAccess, Visitor,
7};
8use serde::forward_to_deserialize_any;
9use serde_json::Error;
10use serde_json::Number;
11use std::ops::Deref;
12use std::sync::Arc;
13
14use crate::Value;
15use crate::{InOMap as Map, InternedString};
16
17impl<'de> Deserialize<'de> for Value {
18 #[inline]
19 fn deserialize<D>(deserializer: D) -> Result<Value, D::Error>
20 where
21 D: serde::Deserializer<'de>,
22 {
23 struct ValueVisitor;
24
25 impl<'de> Visitor<'de> for ValueVisitor {
26 type Value = Value;
27
28 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
29 formatter.write_str("any valid JSON value")
30 }
31
32 #[inline]
33 fn visit_bool<E>(self, value: bool) -> Result<Value, E> {
34 Ok(Value::Bool(value))
35 }
36
37 #[inline]
38 fn visit_i64<E>(self, value: i64) -> Result<Value, E> {
39 Ok(Value::Number(value.into()))
40 }
41
42 #[inline]
43 fn visit_u64<E>(self, value: u64) -> Result<Value, E> {
44 Ok(Value::Number(value.into()))
45 }
46
47 #[inline]
48 fn visit_f64<E>(self, value: f64) -> Result<Value, E> {
49 Ok(Number::from_f64(value).map_or(Value::Null, Value::Number))
50 }
51
52 #[inline]
53 fn visit_str<E>(self, value: &str) -> Result<Value, E>
54 where
55 E: serde::de::Error,
56 {
57 self.visit_string(String::from(value))
58 }
59
60 #[inline]
61 fn visit_string<E>(self, value: String) -> Result<Value, E> {
62 Ok(Value::String(Arc::new(value)))
63 }
64
65 #[inline]
66 fn visit_none<E>(self) -> Result<Value, E> {
67 Ok(Value::Null)
68 }
69
70 #[inline]
71 fn visit_some<D>(self, deserializer: D) -> Result<Value, D::Error>
72 where
73 D: serde::Deserializer<'de>,
74 {
75 Deserialize::deserialize(deserializer)
76 }
77
78 #[inline]
79 fn visit_unit<E>(self) -> Result<Value, E> {
80 Ok(Value::Null)
81 }
82
83 #[inline]
84 fn visit_seq<V>(self, mut visitor: V) -> Result<Value, V::Error>
85 where
86 V: SeqAccess<'de>,
87 {
88 let mut vec = Vector::new();
89
90 while let Some(elem) = visitor.next_element()? {
91 vec.push_back(elem);
92 }
93
94 Ok(Value::Array(vec))
95 }
96
97 fn visit_map<V>(self, mut visitor: V) -> Result<Value, V::Error>
98 where
99 V: MapAccess<'de>,
100 {
101 match visitor.next_key_seed(KeyClassifier)? {
102 Some(KeyClass::Map(first_key)) => {
103 let mut values = Map::new();
104
105 values.insert(first_key, visitor.next_value()?);
106 while let Some((key, value)) = visitor.next_entry()? {
107 values.insert(key, value);
108 }
109
110 Ok(Value::Object(values))
111 }
112 None => Ok(Value::Object(Map::new())),
113 }
114 }
115 }
116
117 deserializer.deserialize_any(ValueVisitor)
118 }
119}
120
121impl FromStr for Value {
122 type Err = Error;
123 fn from_str(s: &str) -> Result<Value, Error> {
124 serde_json::from_str(s)
125 }
126}
127
128macro_rules! deserialize_number {
129 ($method:ident) => {
130 fn $method<V>(self, visitor: V) -> Result<V::Value, Error>
131 where
132 V: Visitor<'de>,
133 {
134 match self {
135 Value::Number(n) => n.$method(visitor),
136 _ => self.deserialize_any(visitor),
137 }
138 }
139 };
140}
141
142fn visit_array<'de, V>(array: Vector<Value>, visitor: V) -> Result<V::Value, Error>
143where
144 V: Visitor<'de>,
145{
146 let len = array.len();
147 let mut deserializer = SeqDeserializer::new(array);
148 let seq = visitor.visit_seq(&mut deserializer)?;
149 let remaining = deserializer.iter.len();
150 if remaining == 0 {
151 Ok(seq)
152 } else {
153 Err(serde::de::Error::invalid_length(
154 len,
155 &"fewer elements in array",
156 ))
157 }
158}
159
160fn visit_object<'de, V>(object: Map<InternedString, Value>, visitor: V) -> Result<V::Value, Error>
161where
162 V: Visitor<'de>,
163{
164 let len = object.len();
165 let mut deserializer = MapDeserializer::new(object);
166 let map = visitor.visit_map(&mut deserializer)?;
167 let remaining = deserializer.iter.len();
168 if remaining == 0 {
169 Ok(map)
170 } else {
171 Err(serde::de::Error::invalid_length(
172 len,
173 &"fewer elements in map",
174 ))
175 }
176}
177
178impl<'de> serde::Deserializer<'de> for Value {
179 type Error = Error;
180
181 #[inline]
182 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
183 where
184 V: Visitor<'de>,
185 {
186 match self {
187 Value::Null => visitor.visit_unit(),
188 Value::Bool(v) => visitor.visit_bool(v),
189 Value::Number(n) => n.deserialize_any(visitor),
190 Value::String(v) => match Arc::try_unwrap(v) {
191 Err(v) => visitor.visit_str(v.as_str()),
192 Ok(v) => visitor.visit_string(v),
193 },
194 Value::Array(v) => visit_array(v, visitor),
195 Value::Object(v) => visit_object(v, visitor),
196 }
197 }
198
199 deserialize_number!(deserialize_i8);
200 deserialize_number!(deserialize_i16);
201 deserialize_number!(deserialize_i32);
202 deserialize_number!(deserialize_i64);
203 deserialize_number!(deserialize_i128);
204 deserialize_number!(deserialize_u8);
205 deserialize_number!(deserialize_u16);
206 deserialize_number!(deserialize_u32);
207 deserialize_number!(deserialize_u64);
208 deserialize_number!(deserialize_u128);
209 deserialize_number!(deserialize_f32);
210 deserialize_number!(deserialize_f64);
211
212 #[inline]
213 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
214 where
215 V: Visitor<'de>,
216 {
217 match self {
218 Value::Null => visitor.visit_none(),
219 _ => visitor.visit_some(self),
220 }
221 }
222
223 #[inline]
224 fn deserialize_enum<V>(
225 self,
226 _name: &str,
227 _variants: &'static [&'static str],
228 visitor: V,
229 ) -> Result<V::Value, Error>
230 where
231 V: Visitor<'de>,
232 {
233 let (variant, value) = match self {
234 Value::Object(value) => {
235 let mut iter = value.into_iter();
236 let (variant, value) = match iter.next() {
237 Some(v) => v,
238 None => {
239 return Err(serde::de::Error::invalid_value(
240 Unexpected::Map,
241 &"map with a single key",
242 ));
243 }
244 };
245 if iter.next().is_some() {
247 return Err(serde::de::Error::invalid_value(
248 Unexpected::Map,
249 &"map with a single key",
250 ));
251 }
252 (variant, Some(value))
253 }
254 Value::String(variant) => (
255 InternedString::intern({
256 struct ArcStr(Arc<String>);
257 impl fmt::Display for ArcStr {
258 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
259 fmt::Display::fmt(&self.0, f)
260 }
261 }
262 impl From<ArcStr> for String {
263 fn from(value: ArcStr) -> Self {
264 Arc::try_unwrap(value.0).unwrap_or_else(|v| v.deref().to_owned())
265 }
266 }
267 ArcStr(variant)
268 }),
269 None,
270 ),
271 other => {
272 return Err(serde::de::Error::invalid_type(
273 other.unexpected(),
274 &"string or map",
275 ));
276 }
277 };
278
279 visitor.visit_enum(EnumDeserializer { variant, value })
280 }
281
282 #[inline]
283 fn deserialize_newtype_struct<V>(
284 self,
285 name: &'static str,
286 visitor: V,
287 ) -> Result<V::Value, Error>
288 where
289 V: Visitor<'de>,
290 {
291 let _ = name;
292 visitor.visit_newtype_struct(self)
293 }
294
295 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Error>
296 where
297 V: Visitor<'de>,
298 {
299 match self {
300 Value::Bool(v) => visitor.visit_bool(v),
301 _ => Err(self.invalid_type(&visitor)),
302 }
303 }
304
305 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Error>
306 where
307 V: Visitor<'de>,
308 {
309 self.deserialize_string(visitor)
310 }
311
312 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Error>
313 where
314 V: Visitor<'de>,
315 {
316 self.deserialize_string(visitor)
317 }
318
319 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Error>
320 where
321 V: Visitor<'de>,
322 {
323 match self {
324 Value::String(v) => match Arc::try_unwrap(v) {
325 Err(v) => visitor.visit_str(v.as_str()),
326 Ok(v) => visitor.visit_string(v),
327 },
328 _ => Err(self.invalid_type(&visitor)),
329 }
330 }
331
332 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Error>
333 where
334 V: Visitor<'de>,
335 {
336 self.deserialize_byte_buf(visitor)
337 }
338
339 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Error>
340 where
341 V: Visitor<'de>,
342 {
343 match self {
344 Value::String(v) => match Arc::try_unwrap(v) {
345 Err(v) => visitor.visit_str(v.as_str()),
346 Ok(v) => visitor.visit_string(v),
347 },
348 Value::Array(v) => visit_array(v, visitor),
349 _ => Err(self.invalid_type(&visitor)),
350 }
351 }
352
353 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Error>
354 where
355 V: Visitor<'de>,
356 {
357 match self {
358 Value::Null => visitor.visit_unit(),
359 _ => Err(self.invalid_type(&visitor)),
360 }
361 }
362
363 fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value, Error>
364 where
365 V: Visitor<'de>,
366 {
367 self.deserialize_unit(visitor)
368 }
369
370 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Error>
371 where
372 V: Visitor<'de>,
373 {
374 match self {
375 Value::Array(v) => visit_array(v, visitor),
376 _ => Err(self.invalid_type(&visitor)),
377 }
378 }
379
380 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error>
381 where
382 V: Visitor<'de>,
383 {
384 self.deserialize_seq(visitor)
385 }
386
387 fn deserialize_tuple_struct<V>(
388 self,
389 _name: &'static str,
390 _len: usize,
391 visitor: V,
392 ) -> Result<V::Value, Error>
393 where
394 V: Visitor<'de>,
395 {
396 self.deserialize_seq(visitor)
397 }
398
399 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Error>
400 where
401 V: Visitor<'de>,
402 {
403 match self {
404 Value::Object(v) => visit_object(v, visitor),
405 _ => Err(self.invalid_type(&visitor)),
406 }
407 }
408
409 fn deserialize_struct<V>(
410 self,
411 _name: &'static str,
412 _fields: &'static [&'static str],
413 visitor: V,
414 ) -> Result<V::Value, Error>
415 where
416 V: Visitor<'de>,
417 {
418 match self {
419 Value::Array(v) => visit_array(v, visitor),
420 Value::Object(v) => visit_object(v, visitor),
421 _ => Err(self.invalid_type(&visitor)),
422 }
423 }
424
425 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Error>
426 where
427 V: Visitor<'de>,
428 {
429 self.deserialize_string(visitor)
430 }
431
432 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error>
433 where
434 V: Visitor<'de>,
435 {
436 drop(self);
437 visitor.visit_unit()
438 }
439}
440
441struct EnumDeserializer {
442 variant: InternedString,
443 value: Option<Value>,
444}
445
446impl<'de> EnumAccess<'de> for EnumDeserializer {
447 type Error = Error;
448 type Variant = VariantDeserializer;
449
450 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, VariantDeserializer), Error>
451 where
452 V: DeserializeSeed<'de>,
453 {
454 let variant = self.variant.into_deserializer();
455 let visitor = VariantDeserializer { value: self.value };
456 seed.deserialize(variant).map(|v| (v, visitor))
457 }
458}
459
460impl<'de> IntoDeserializer<'de, Error> for Value {
461 type Deserializer = Self;
462
463 fn into_deserializer(self) -> Self::Deserializer {
464 self
465 }
466}
467
468struct VariantDeserializer {
469 value: Option<Value>,
470}
471
472impl<'de> VariantAccess<'de> for VariantDeserializer {
473 type Error = Error;
474
475 fn unit_variant(self) -> Result<(), Error> {
476 match self.value {
477 Some(value) => Deserialize::deserialize(value),
478 None => Ok(()),
479 }
480 }
481
482 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Error>
483 where
484 T: DeserializeSeed<'de>,
485 {
486 match self.value {
487 Some(value) => seed.deserialize(value),
488 None => Err(serde::de::Error::invalid_type(
489 Unexpected::UnitVariant,
490 &"newtype variant",
491 )),
492 }
493 }
494
495 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error>
496 where
497 V: Visitor<'de>,
498 {
499 match self.value {
500 Some(Value::Array(v)) => {
501 if v.is_empty() {
502 visitor.visit_unit()
503 } else {
504 visit_array(v, visitor)
505 }
506 }
507 Some(other) => Err(serde::de::Error::invalid_type(
508 other.unexpected(),
509 &"tuple variant",
510 )),
511 None => Err(serde::de::Error::invalid_type(
512 Unexpected::UnitVariant,
513 &"tuple variant",
514 )),
515 }
516 }
517
518 fn struct_variant<V>(
519 self,
520 _fields: &'static [&'static str],
521 visitor: V,
522 ) -> Result<V::Value, Error>
523 where
524 V: Visitor<'de>,
525 {
526 match self.value {
527 Some(Value::Object(v)) => visit_object(v, visitor),
528 Some(other) => Err(serde::de::Error::invalid_type(
529 other.unexpected(),
530 &"struct variant",
531 )),
532 None => Err(serde::de::Error::invalid_type(
533 Unexpected::UnitVariant,
534 &"struct variant",
535 )),
536 }
537 }
538}
539
540struct SeqDeserializer {
541 iter: imbl::vector::ConsumingIter<Value>,
542}
543
544impl SeqDeserializer {
545 fn new(vec: Vector<Value>) -> Self {
546 SeqDeserializer {
547 iter: vec.into_iter(),
548 }
549 }
550}
551
552impl<'de> SeqAccess<'de> for SeqDeserializer {
553 type Error = Error;
554
555 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
556 where
557 T: DeserializeSeed<'de>,
558 {
559 match self.iter.next() {
560 Some(value) => seed.deserialize(value).map(Some),
561 None => Ok(None),
562 }
563 }
564
565 fn size_hint(&self) -> Option<usize> {
566 match self.iter.size_hint() {
567 (lower, Some(upper)) if lower == upper => Some(upper),
568 _ => None,
569 }
570 }
571}
572
573struct MapDeserializer {
574 iter: <Map<InternedString, Value> as IntoIterator>::IntoIter,
575 value: Option<Value>,
576}
577
578impl MapDeserializer {
579 fn new(map: Map<InternedString, Value>) -> Self {
580 MapDeserializer {
581 iter: map.into_iter(),
582 value: None,
583 }
584 }
585}
586
587impl<'de> MapAccess<'de> for MapDeserializer {
588 type Error = Error;
589
590 fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
591 where
592 T: DeserializeSeed<'de>,
593 {
594 match self.iter.next() {
595 Some((key, value)) => {
596 self.value = Some(value);
597 let key_de = MapKeyDeserializer { key };
598 seed.deserialize(key_de).map(Some)
599 }
600 None => Ok(None),
601 }
602 }
603
604 fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Error>
605 where
606 T: DeserializeSeed<'de>,
607 {
608 match self.value.take() {
609 Some(value) => seed.deserialize(value),
610 None => Err(serde::de::Error::custom("value is missing")),
611 }
612 }
613
614 fn size_hint(&self) -> Option<usize> {
615 match self.iter.size_hint() {
616 (lower, Some(upper)) if lower == upper => Some(upper),
617 _ => None,
618 }
619 }
620}
621
622macro_rules! deserialize_value_ref_number {
623 ($method:ident) => {
624 fn $method<V>(self, visitor: V) -> Result<V::Value, Error>
625 where
626 V: Visitor<'de>,
627 {
628 match self {
629 Value::Number(n) => n.deserialize_any(visitor),
630 _ => Err(self.invalid_type(&visitor)),
631 }
632 }
633 };
634}
635
636fn visit_array_ref<'de, V>(array: &'de Vector<Value>, visitor: V) -> Result<V::Value, Error>
637where
638 V: Visitor<'de>,
639{
640 let len = array.len();
641 let mut deserializer = SeqRefDeserializer::new(array);
642 let seq = visitor.visit_seq(&mut deserializer)?;
643 let remaining = deserializer.iter.len();
644 if remaining == 0 {
645 Ok(seq)
646 } else {
647 Err(serde::de::Error::invalid_length(
648 len,
649 &"fewer elements in array",
650 ))
651 }
652}
653
654fn visit_object_ref<'de, V>(
655 object: &'de Map<InternedString, Value>,
656 visitor: V,
657) -> Result<V::Value, Error>
658where
659 V: Visitor<'de>,
660{
661 let len = object.len();
662 let mut deserializer = MapRefDeserializer::new(object);
663 let map = visitor.visit_map(&mut deserializer)?;
664 let remaining = deserializer.iter.len();
665 if remaining == 0 {
666 Ok(map)
667 } else {
668 Err(serde::de::Error::invalid_length(
669 len,
670 &"fewer elements in map",
671 ))
672 }
673}
674
675impl<'de> serde::Deserializer<'de> for &'de Value {
676 type Error = Error;
677
678 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
679 where
680 V: Visitor<'de>,
681 {
682 match self {
683 Value::Null => visitor.visit_unit(),
684 Value::Bool(v) => visitor.visit_bool(*v),
685 Value::Number(n) => n.deserialize_any(visitor),
686 Value::String(v) => visitor.visit_borrowed_str(v),
687 Value::Array(v) => visit_array_ref(v, visitor),
688 Value::Object(v) => visit_object_ref(v, visitor),
689 }
690 }
691
692 deserialize_value_ref_number!(deserialize_i8);
693 deserialize_value_ref_number!(deserialize_i16);
694 deserialize_value_ref_number!(deserialize_i32);
695 deserialize_value_ref_number!(deserialize_i64);
696 deserialize_number!(deserialize_i128);
697 deserialize_value_ref_number!(deserialize_u8);
698 deserialize_value_ref_number!(deserialize_u16);
699 deserialize_value_ref_number!(deserialize_u32);
700 deserialize_value_ref_number!(deserialize_u64);
701 deserialize_number!(deserialize_u128);
702 deserialize_value_ref_number!(deserialize_f32);
703 deserialize_value_ref_number!(deserialize_f64);
704
705 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
706 where
707 V: Visitor<'de>,
708 {
709 match *self {
710 Value::Null => visitor.visit_none(),
711 _ => visitor.visit_some(self),
712 }
713 }
714
715 fn deserialize_enum<V>(
716 self,
717 _name: &str,
718 _variants: &'static [&'static str],
719 visitor: V,
720 ) -> Result<V::Value, Error>
721 where
722 V: Visitor<'de>,
723 {
724 let (variant, value) = match self {
725 Value::Object(value) => {
726 let mut iter = value.into_iter();
727 let (variant, value) = match iter.next() {
728 Some(v) => v,
729 None => {
730 return Err(serde::de::Error::invalid_value(
731 Unexpected::Map,
732 &"map with a single key",
733 ));
734 }
735 };
736 if iter.next().is_some() {
738 return Err(serde::de::Error::invalid_value(
739 Unexpected::Map,
740 &"map with a single key",
741 ));
742 }
743 (&**variant, Some(value))
744 }
745 Value::String(variant) => (&***variant, None),
746 other => {
747 return Err(serde::de::Error::invalid_type(
748 other.unexpected(),
749 &"string or map",
750 ));
751 }
752 };
753
754 visitor.visit_enum(EnumRefDeserializer { variant, value })
755 }
756
757 #[inline]
758 fn deserialize_newtype_struct<V>(
759 self,
760 name: &'static str,
761 visitor: V,
762 ) -> Result<V::Value, Error>
763 where
764 V: Visitor<'de>,
765 {
766 let _ = name;
767 visitor.visit_newtype_struct(self)
768 }
769
770 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Error>
771 where
772 V: Visitor<'de>,
773 {
774 match *self {
775 Value::Bool(v) => visitor.visit_bool(v),
776 _ => Err(self.invalid_type(&visitor)),
777 }
778 }
779
780 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Error>
781 where
782 V: Visitor<'de>,
783 {
784 self.deserialize_str(visitor)
785 }
786
787 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Error>
788 where
789 V: Visitor<'de>,
790 {
791 match self {
792 Value::String(v) => visitor.visit_borrowed_str(v),
793 _ => Err(self.invalid_type(&visitor)),
794 }
795 }
796
797 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Error>
798 where
799 V: Visitor<'de>,
800 {
801 self.deserialize_str(visitor)
802 }
803
804 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Error>
805 where
806 V: Visitor<'de>,
807 {
808 match self {
809 Value::String(v) => visitor.visit_borrowed_str(v),
810 Value::Array(v) => visit_array_ref(v, visitor),
811 _ => Err(self.invalid_type(&visitor)),
812 }
813 }
814
815 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Error>
816 where
817 V: Visitor<'de>,
818 {
819 self.deserialize_bytes(visitor)
820 }
821
822 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Error>
823 where
824 V: Visitor<'de>,
825 {
826 match *self {
827 Value::Null => visitor.visit_unit(),
828 _ => Err(self.invalid_type(&visitor)),
829 }
830 }
831
832 fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value, Error>
833 where
834 V: Visitor<'de>,
835 {
836 self.deserialize_unit(visitor)
837 }
838
839 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Error>
840 where
841 V: Visitor<'de>,
842 {
843 match self {
844 Value::Array(v) => visit_array_ref(v, visitor),
845 _ => Err(self.invalid_type(&visitor)),
846 }
847 }
848
849 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error>
850 where
851 V: Visitor<'de>,
852 {
853 self.deserialize_seq(visitor)
854 }
855
856 fn deserialize_tuple_struct<V>(
857 self,
858 _name: &'static str,
859 _len: usize,
860 visitor: V,
861 ) -> Result<V::Value, Error>
862 where
863 V: Visitor<'de>,
864 {
865 self.deserialize_seq(visitor)
866 }
867
868 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Error>
869 where
870 V: Visitor<'de>,
871 {
872 match self {
873 Value::Object(v) => visit_object_ref(v, visitor),
874 _ => Err(self.invalid_type(&visitor)),
875 }
876 }
877
878 fn deserialize_struct<V>(
879 self,
880 _name: &'static str,
881 _fields: &'static [&'static str],
882 visitor: V,
883 ) -> Result<V::Value, Error>
884 where
885 V: Visitor<'de>,
886 {
887 match self {
888 Value::Array(v) => visit_array_ref(v, visitor),
889 Value::Object(v) => visit_object_ref(v, visitor),
890 _ => Err(self.invalid_type(&visitor)),
891 }
892 }
893
894 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Error>
895 where
896 V: Visitor<'de>,
897 {
898 self.deserialize_str(visitor)
899 }
900
901 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Error>
902 where
903 V: Visitor<'de>,
904 {
905 visitor.visit_unit()
906 }
907}
908
909struct EnumRefDeserializer<'de> {
910 variant: &'de str,
911 value: Option<&'de Value>,
912}
913
914impl<'de> EnumAccess<'de> for EnumRefDeserializer<'de> {
915 type Error = Error;
916 type Variant = VariantRefDeserializer<'de>;
917
918 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Error>
919 where
920 V: DeserializeSeed<'de>,
921 {
922 let variant = self.variant.into_deserializer();
923 let visitor = VariantRefDeserializer { value: self.value };
924 seed.deserialize(variant).map(|v| (v, visitor))
925 }
926}
927
928struct VariantRefDeserializer<'de> {
929 value: Option<&'de Value>,
930}
931
932impl<'de> VariantAccess<'de> for VariantRefDeserializer<'de> {
933 type Error = Error;
934
935 fn unit_variant(self) -> Result<(), Error> {
936 match self.value {
937 Some(value) => Deserialize::deserialize(value),
938 None => Ok(()),
939 }
940 }
941
942 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Error>
943 where
944 T: DeserializeSeed<'de>,
945 {
946 match self.value {
947 Some(value) => seed.deserialize(value),
948 None => Err(serde::de::Error::invalid_type(
949 Unexpected::UnitVariant,
950 &"newtype variant",
951 )),
952 }
953 }
954
955 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Error>
956 where
957 V: Visitor<'de>,
958 {
959 match self.value {
960 Some(Value::Array(v)) => {
961 if v.is_empty() {
962 visitor.visit_unit()
963 } else {
964 visit_array_ref(v, visitor)
965 }
966 }
967 Some(other) => Err(serde::de::Error::invalid_type(
968 other.unexpected(),
969 &"tuple variant",
970 )),
971 None => Err(serde::de::Error::invalid_type(
972 Unexpected::UnitVariant,
973 &"tuple variant",
974 )),
975 }
976 }
977
978 fn struct_variant<V>(
979 self,
980 _fields: &'static [&'static str],
981 visitor: V,
982 ) -> Result<V::Value, Error>
983 where
984 V: Visitor<'de>,
985 {
986 match self.value {
987 Some(Value::Object(v)) => visit_object_ref(v, visitor),
988 Some(other) => Err(serde::de::Error::invalid_type(
989 other.unexpected(),
990 &"struct variant",
991 )),
992 None => Err(serde::de::Error::invalid_type(
993 Unexpected::UnitVariant,
994 &"struct variant",
995 )),
996 }
997 }
998}
999
1000struct SeqRefDeserializer<'de> {
1001 iter: imbl::vector::Iter<'de, Value>,
1002}
1003
1004impl<'de> SeqRefDeserializer<'de> {
1005 fn new(slice: &'de Vector<Value>) -> Self {
1006 SeqRefDeserializer { iter: slice.iter() }
1007 }
1008}
1009
1010impl<'de> SeqAccess<'de> for SeqRefDeserializer<'de> {
1011 type Error = Error;
1012
1013 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
1014 where
1015 T: DeserializeSeed<'de>,
1016 {
1017 match self.iter.next() {
1018 Some(value) => seed.deserialize(value).map(Some),
1019 None => Ok(None),
1020 }
1021 }
1022
1023 fn size_hint(&self) -> Option<usize> {
1024 match self.iter.size_hint() {
1025 (lower, Some(upper)) if lower == upper => Some(upper),
1026 _ => None,
1027 }
1028 }
1029}
1030
1031struct MapRefDeserializer<'de> {
1032 iter: <&'de Map<InternedString, Value> as IntoIterator>::IntoIter,
1033 value: Option<&'de Value>,
1034}
1035
1036impl<'de> MapRefDeserializer<'de> {
1037 fn new(map: &'de Map<InternedString, Value>) -> Self {
1038 MapRefDeserializer {
1039 iter: map.into_iter(),
1040 value: None,
1041 }
1042 }
1043}
1044
1045impl<'de> MapAccess<'de> for MapRefDeserializer<'de> {
1046 type Error = Error;
1047
1048 fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
1049 where
1050 T: DeserializeSeed<'de>,
1051 {
1052 match self.iter.next() {
1053 Some((key, value)) => {
1054 self.value = Some(value);
1055 let key_de = MapKeyDeserializer { key: key.clone() };
1056 seed.deserialize(key_de).map(Some)
1057 }
1058 None => Ok(None),
1059 }
1060 }
1061
1062 fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Error>
1063 where
1064 T: DeserializeSeed<'de>,
1065 {
1066 match self.value.take() {
1067 Some(value) => seed.deserialize(value),
1068 None => Err(serde::de::Error::custom("value is missing")),
1069 }
1070 }
1071
1072 fn size_hint(&self) -> Option<usize> {
1073 match self.iter.size_hint() {
1074 (lower, Some(upper)) if lower == upper => Some(upper),
1075 _ => None,
1076 }
1077 }
1078}
1079
1080struct MapKeyDeserializer {
1081 key: InternedString,
1082}
1083
1084macro_rules! deserialize_integer_key {
1085 ($method:ident => $visit:ident) => {
1086 fn $method<V>(self, visitor: V) -> Result<V::Value, Error>
1087 where
1088 V: Visitor<'de>,
1089 {
1090 match self.key.parse() {
1091 Ok(integer) => visitor.$visit(integer),
1092 Err(_) => visitor.visit_str(&*self.key),
1093 }
1094 }
1095 };
1096}
1097
1098impl<'de> serde::Deserializer<'de> for MapKeyDeserializer {
1099 type Error = Error;
1100
1101 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
1102 where
1103 V: Visitor<'de>,
1104 {
1105 InternedStringDeserializer::new(self.key).deserialize_any(visitor)
1106 }
1107
1108 deserialize_integer_key!(deserialize_i8 => visit_i8);
1109 deserialize_integer_key!(deserialize_i16 => visit_i16);
1110 deserialize_integer_key!(deserialize_i32 => visit_i32);
1111 deserialize_integer_key!(deserialize_i64 => visit_i64);
1112 deserialize_integer_key!(deserialize_i128 => visit_i128);
1113 deserialize_integer_key!(deserialize_u8 => visit_u8);
1114 deserialize_integer_key!(deserialize_u16 => visit_u16);
1115 deserialize_integer_key!(deserialize_u32 => visit_u32);
1116 deserialize_integer_key!(deserialize_u64 => visit_u64);
1117 deserialize_integer_key!(deserialize_u128 => visit_u128);
1118
1119 #[inline]
1120 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
1121 where
1122 V: Visitor<'de>,
1123 {
1124 visitor.visit_some(self)
1126 }
1127
1128 #[inline]
1129 fn deserialize_newtype_struct<V>(
1130 self,
1131 _name: &'static str,
1132 visitor: V,
1133 ) -> Result<V::Value, Error>
1134 where
1135 V: Visitor<'de>,
1136 {
1137 visitor.visit_newtype_struct(self)
1138 }
1139
1140 fn deserialize_enum<V>(
1141 self,
1142 name: &'static str,
1143 variants: &'static [&'static str],
1144 visitor: V,
1145 ) -> Result<V::Value, Error>
1146 where
1147 V: Visitor<'de>,
1148 {
1149 InternedStringDeserializer::new(self.key).deserialize_enum(name, variants, visitor)
1150 }
1151
1152 forward_to_deserialize_any! {
1153 bool f32 f64 char str string bytes byte_buf unit unit_struct seq tuple
1154 tuple_struct map struct identifier ignored_any
1155 }
1156}
1157
1158struct KeyClassifier;
1159
1160enum KeyClass {
1161 Map(InternedString),
1162}
1163
1164impl<'de> DeserializeSeed<'de> for KeyClassifier {
1165 type Value = KeyClass;
1166
1167 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
1168 where
1169 D: serde::Deserializer<'de>,
1170 {
1171 deserializer.deserialize_str(self)
1172 }
1173}
1174
1175impl<'de> Visitor<'de> for KeyClassifier {
1176 type Value = KeyClass;
1177
1178 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1179 formatter.write_str("a string key")
1180 }
1181
1182 fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
1183 where
1184 E: de::Error,
1185 {
1186 match s {
1187 _ => Ok(KeyClass::Map(InternedString::intern(s))),
1188 }
1189 }
1190
1191 fn visit_string<E>(self, s: String) -> Result<Self::Value, E>
1192 where
1193 E: de::Error,
1194 {
1195 match s.as_str() {
1196 _ => Ok(KeyClass::Map(InternedString::intern(s))),
1197 }
1198 }
1199}
1200
1201impl Value {
1202 #[cold]
1203 fn invalid_type<E>(&self, exp: &dyn Expected) -> E
1204 where
1205 E: serde::de::Error,
1206 {
1207 serde::de::Error::invalid_type(self.unexpected(), exp)
1208 }
1209
1210 #[cold]
1211 fn unexpected(&self) -> Unexpected {
1212 match self {
1213 Value::Null => Unexpected::Unit,
1214 Value::Bool(b) => Unexpected::Bool(*b),
1215 Value::Number(n) => {
1216 if let Some(n) = n.as_u64() {
1217 Unexpected::Unsigned(n)
1218 } else if let Some(n) = n.as_i64() {
1219 Unexpected::Signed(n)
1220 } else if let Some(n) = n.as_f64() {
1221 Unexpected::Float(n)
1222 } else {
1223 unreachable!()
1224 }
1225 }
1226 Value::String(s) => Unexpected::Str(s),
1227 Value::Array(_) => Unexpected::Seq,
1228 Value::Object(_) => Unexpected::Map,
1229 }
1230 }
1231}
1232
1233impl From<InternedString> for InternedStringDeserializer {
1234 fn from(value: InternedString) -> Self {
1235 Self { value }
1236 }
1237}
1238pub struct InternedStringDeserializer {
1239 value: InternedString,
1240}
1241
1242impl InternedStringDeserializer {
1243 fn new(value: InternedString) -> Self {
1244 InternedStringDeserializer { value }
1245 }
1246}
1247
1248impl<'de> de::Deserializer<'de> for InternedStringDeserializer {
1249 type Error = Error;
1250
1251 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
1252 where
1253 V: de::Visitor<'de>,
1254 {
1255 visitor.visit_str(&*self.value)
1256 }
1257
1258 fn deserialize_enum<V>(
1259 self,
1260 _name: &str,
1261 _variants: &'static [&'static str],
1262 visitor: V,
1263 ) -> Result<V::Value, Error>
1264 where
1265 V: de::Visitor<'de>,
1266 {
1267 visitor.visit_enum(self)
1268 }
1269
1270 forward_to_deserialize_any! {
1271 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
1272 bytes byte_buf option unit unit_struct newtype_struct seq tuple
1273 tuple_struct map struct identifier ignored_any
1274 }
1275}
1276
1277impl<'de> de::EnumAccess<'de> for InternedStringDeserializer {
1278 type Error = Error;
1279 type Variant = UnitOnly;
1280
1281 fn variant_seed<T>(self, seed: T) -> Result<(T::Value, Self::Variant), Error>
1282 where
1283 T: de::DeserializeSeed<'de>,
1284 {
1285 let value = seed.deserialize(self)?;
1286 Ok((value, UnitOnly))
1287 }
1288}
1289
1290pub struct UnitOnly;
1291
1292impl<'de> de::VariantAccess<'de> for UnitOnly {
1293 type Error = Error;
1294
1295 fn unit_variant(self) -> Result<(), Error> {
1296 Ok(())
1297 }
1298
1299 fn newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value, Error>
1300 where
1301 T: de::DeserializeSeed<'de>,
1302 {
1303 Err(de::Error::invalid_type(
1304 Unexpected::UnitVariant,
1305 &"newtype variant",
1306 ))
1307 }
1308
1309 fn tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value, Error>
1310 where
1311 V: de::Visitor<'de>,
1312 {
1313 Err(de::Error::invalid_type(
1314 Unexpected::UnitVariant,
1315 &"tuple variant",
1316 ))
1317 }
1318
1319 fn struct_variant<V>(
1320 self,
1321 _fields: &'static [&'static str],
1322 _visitor: V,
1323 ) -> Result<V::Value, Error>
1324 where
1325 V: de::Visitor<'de>,
1326 {
1327 Err(de::Error::invalid_type(
1328 Unexpected::UnitVariant,
1329 &"struct variant",
1330 ))
1331 }
1332}