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}