litl_val/to_other/deserializer/
val_e.rs1use serde::Deserializer;
2use serde::{
3 de::{
4 value::{MapDeserializer, SeqDeserializer},
5 Error, IntoDeserializer, Unexpected, Visitor,
6 },
7 forward_to_deserialize_any,
8};
9
10use super::ValDeserializerError;
11use crate::ValE;
12
13impl<'de> Deserializer<'de> for ValE {
14 type Error = ValDeserializerError;
15
16 #[inline]
17 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
18 where
19 V: serde::de::Visitor<'de>,
20 {
21 match self {
22 ValE::Null => visitor.visit_none(),
23 ValE::Bool(b) => visitor.visit_bool(b),
24 ValE::Number(n) => {
25 let float = n.into_inner();
28 if float.fract() == 0.0 {
29 visitor.visit_i64(float as i64)
30 } else {
31 visitor.visit_f64(float)
32 }
33 }
34 ValE::ShortString(s) => visitor.visit_str(s.as_ref()),
35 ValE::LongString(s) => visitor.visit_str(s.as_ref()),
36 ValE::Array(a) => visitor.visit_seq(SeqDeserializer::new(a.into_vec().into_iter())),
37 ValE::Object(o) => {
38 visitor.visit_map(MapDeserializer::new(o.into_entries().0.into_iter()))
39 }
40 }
41 }
42
43 forward_to_deserialize_any! {
44 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
45 bytes byte_buf unit unit_struct newtype_struct seq tuple
46 tuple_struct map struct identifier ignored_any
47 }
48
49 #[inline]
50 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
51 where
52 V: Visitor<'de>,
53 {
54 match self {
55 ValE::Null => visitor.visit_none(),
56 _ => visitor.visit_some(self),
57 }
58 }
59
60 #[inline]
61 fn deserialize_enum<V>(
62 self,
63 _name: &str,
64 _variants: &'static [&'static str],
65 visitor: V,
66 ) -> Result<V::Value, Self::Error>
67 where
68 V: Visitor<'de>,
69 {
70 deserialize_val_e_enum(self, visitor)
71 }
72}
73
74#[inline]
75pub fn deserialize_val_e_enum<'de, V: Visitor<'de>>(
76 val: ValE,
77 visitor: V,
78) -> Result<V::Value, ValDeserializerError> {
79 let (variant, value) = match val {
80 ValE::Object(value) => {
81 let mut iter = value.into_entries().0.into_iter();
82 let (variant, value) = match iter.next() {
83 Some((k, v)) => (k.into_string(), v),
84 None => {
85 return Err(ValDeserializerError::invalid_value(
86 Unexpected::Map,
87 &"map with a single key",
88 ));
89 }
90 };
91 if iter.next().is_some() {
93 return Err(ValDeserializerError::invalid_value(
94 Unexpected::Map,
95 &"map with a single key",
96 ));
97 }
98 (variant, Some(value))
99 }
100 ValE::ShortString(variant) => (variant.as_ref().to_string(), None),
101 ValE::LongString(variant) => (variant.into_string(), None),
102 other => {
103 return Err(ValDeserializerError::invalid_type(
104 Unexpected::Other(&format!("{:?}", other)),
105 &"string or map",
106 ));
107 }
108 };
109
110 visitor.visit_enum(super::enum_de::EnumDeserializer { variant, value })
111}
112
113impl<'de> IntoDeserializer<'de> for ValE {
114 type Deserializer = Self;
115
116 fn into_deserializer(self) -> Self::Deserializer {
117 self
118 }
119}