Skip to main content

perde_core/decode/
object.rs

1use crate::{
2    error::Convert,
3    schema::Any,
4    types::{self, Object},
5};
6use serde::{
7    de::{DeserializeSeed, Deserializer, EnumAccess, Error, MapAccess, SeqAccess, Visitor},
8    Deserialize,
9};
10use std::{borrow::Cow, fmt};
11
12struct AnyVisitor;
13
14impl<'de> Visitor<'de> for AnyVisitor {
15    type Value = Object;
16
17    fn expecting(&self, _: &mut fmt::Formatter) -> fmt::Result {
18        unreachable!()
19    }
20
21    fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
22    where
23        E: Error,
24    {
25        Ok(Object::new_bool(v))
26    }
27
28    fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E>
29    where
30        E: Error,
31    {
32        self.visit_i64(v as i64)
33    }
34
35    fn visit_i16<E>(self, v: i16) -> Result<Self::Value, E>
36    where
37        E: Error,
38    {
39        self.visit_i64(v as i64)
40    }
41
42    fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>
43    where
44        E: Error,
45    {
46        self.visit_i64(v as i64)
47    }
48
49    fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
50    where
51        E: Error,
52    {
53        Object::new_i64(v).de()
54    }
55
56    fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>
57    where
58        E: Error,
59    {
60        self.visit_u64(v as u64)
61    }
62
63    fn visit_u16<E>(self, v: u16) -> Result<Self::Value, E>
64    where
65        E: Error,
66    {
67        self.visit_u64(v as u64)
68    }
69
70    fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E>
71    where
72        E: Error,
73    {
74        self.visit_u64(v as u64)
75    }
76
77    fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
78    where
79        E: Error,
80    {
81        Object::new_u64(v).de()
82    }
83
84    fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E>
85    where
86        E: Error,
87    {
88        self.visit_f64(v as f64)
89    }
90
91    fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
92    where
93        E: Error,
94    {
95        Object::new_f64(v).de()
96    }
97
98    fn visit_char<E>(self, v: char) -> Result<Self::Value, E>
99    where
100        E: Error,
101    {
102        self.visit_borrowed_str(&v.to_string())
103    }
104
105    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
106    where
107        E: Error,
108    {
109        self.visit_borrowed_str(v)
110    }
111
112    fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
113    where
114        E: Error,
115    {
116        Object::new_str(v).de()
117    }
118
119    fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
120    where
121        E: Error,
122    {
123        self.visit_borrowed_str(&v)
124    }
125
126    fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
127    where
128        E: Error,
129    {
130        self.visit_borrowed_bytes(v)
131    }
132
133    fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
134    where
135        E: Error,
136    {
137        Object::new_bytes(v).de()
138    }
139
140    fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
141    where
142        E: Error,
143    {
144        self.visit_borrowed_bytes(&v)
145    }
146
147    fn visit_none<E>(self) -> Result<Self::Value, E>
148    where
149        E: Error,
150    {
151        Ok(Object::new_none())
152    }
153
154    fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
155    where
156        D: Deserializer<'de>,
157    {
158        deserializer.deserialize_any(AnyVisitor)
159    }
160
161    fn visit_unit<E>(self) -> Result<Self::Value, E>
162    where
163        E: Error,
164    {
165        Ok(Object::new_none())
166    }
167
168    fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
169    where
170        D: Deserializer<'de>,
171    {
172        deserializer.deserialize_any(AnyVisitor)
173    }
174
175    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
176    where
177        A: SeqAccess<'de>,
178    {
179        let mut args: smallvec::SmallVec<[Object; 16]> = smallvec::SmallVec::new();
180
181        while let Some(arg) = seq.next_element()? {
182            let arg: Object = arg;
183            args.push(arg);
184        }
185
186        let mut list = types::List::new(args.len()).de()?;
187        for (i, arg) in args.into_iter().enumerate() {
188            list.set(i, arg);
189        }
190
191        Ok(list.into_inner())
192    }
193
194    fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
195    where
196        A: MapAccess<'de>,
197    {
198        let mut dict = types::Dict::new().de()?;
199
200        while let Some(k) = map.next_key()? {
201            let k: Cow<str> = k;
202            let v = map.next_value()?;
203            dict.set(Object::new_str(&k).de()?, v).de()?;
204        }
205
206        Ok(dict.into_inner())
207    }
208
209    fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>
210    where
211        A: EnumAccess<'de>,
212    {
213        let (v, _) = data.variant()?;
214        Ok(v)
215    }
216}
217
218impl<'de> Deserialize<'de> for Object {
219    fn deserialize<D>(de: D) -> Result<Self, D::Error>
220    where
221        D: Deserializer<'de>,
222    {
223        de.deserialize_any(AnyVisitor)
224    }
225}
226
227impl<'a, 'de> DeserializeSeed<'de> for &'a Any {
228    type Value = Object;
229
230    fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
231    where
232        D: Deserializer<'de>,
233    {
234        deserializer.deserialize_any(AnyVisitor)
235    }
236}