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