1use core::{fmt, marker::PhantomData};
2
3use alloc::{boxed::Box, string::ToString, vec};
4use serde::de::{self, Error as _, IntoDeserializer, Unexpected, Visitor};
5
6use crate::{Error, Owned, Ref, Value};
7
8impl de::Error for Error {
9 fn custom<T>(msg: T) -> Self
10 where
11 T: fmt::Display,
12 {
13 Error(msg.to_string())
14 }
15}
16
17pub struct Deserializer<'de>(Value<'de>);
23
24impl<'de> de::Deserializer<'de> for Deserializer<'de> {
25 type Error = Error;
26
27 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
28 where
29 V: de::Visitor<'de>,
30 {
31 match self.0 {
32 Value::U8(v) => visitor.visit_u8(v),
33 Value::U16(v) => visitor.visit_u16(v),
34 Value::U32(v) => visitor.visit_u32(v),
35 Value::U64(v) => visitor.visit_u64(v),
36 Value::U128(v) => visitor.visit_u128(v),
37 Value::I8(v) => visitor.visit_i8(v),
38 Value::I16(v) => visitor.visit_i16(v),
39 Value::I32(v) => visitor.visit_i32(v),
40 Value::I64(v) => visitor.visit_i64(v),
41 Value::I128(v) => visitor.visit_i128(v),
42 Value::F32(v) => visitor.visit_f32(v),
43 Value::F64(v) => visitor.visit_f64(v),
44 Value::Bool(v) => visitor.visit_bool(v),
45 Value::Char(v) => visitor.visit_char(v),
46 Value::Str(v) => visitor.visit_string(v.into()),
47 Value::BorrowedStr(v) => visitor.visit_borrowed_str(v),
48 Value::Bytes(v) => visitor.visit_byte_buf(v.into_vec()),
49 Value::BorrowedBytes(v) => visitor.visit_borrowed_bytes(v),
50 Value::None => visitor.visit_none(),
51 Value::Some(v) => visitor.visit_some((*v).into_deserializer()),
52 Value::Unit => visitor.visit_unit(),
53 Value::UnitStruct { name: _ } => visitor.visit_unit(),
54 Value::NewtypeStruct { name: _, value } => {
55 visitor.visit_newtype_struct(Deserializer(*value))
56 }
57 Value::Struct { fields, name: _ } => visitor.visit_map(Map::new_str_key(fields)),
58 Value::TupleStruct { fields, name: _ } => visitor.visit_seq(Seq::new(fields)),
59 Value::Tuple(v) => visitor.visit_seq(Seq::new(v)),
60 Value::UnitVariant {
61 name: _,
62 variant_index,
63 variant,
64 } => visitor.visit_enum(Enum {
65 variant_index,
66 variant,
67 value: Variant::Value(Value::Unit),
68 }),
69 Value::NewtypeVariant {
70 name: _,
71 variant_index,
72 variant,
73 value,
74 } => visitor.visit_enum(Enum {
75 variant_index,
76 variant,
77 value: Variant::Value(*value),
78 }),
79 Value::TupleVariant {
80 name: _,
81 variant_index,
82 variant,
83 fields,
84 } => visitor.visit_enum(Enum {
85 variant_index,
86 variant,
87 value: Variant::Tuple(fields),
88 }),
89 Value::StructVariant {
90 name: _,
91 variant_index,
92 variant,
93 fields,
94 } => visitor.visit_enum(Enum {
95 variant_index,
96 variant,
97 value: Variant::Struct(fields),
98 }),
99 Value::Seq(v) => visitor.visit_seq(Seq::new(v)),
100 Value::Map(v) => visitor.visit_map(Map::new(v)),
101 }
102 }
103
104 serde::forward_to_deserialize_any! {
105 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
106 bytes byte_buf option unit unit_struct newtype_struct seq tuple
107 tuple_struct map struct enum identifier ignored_any
108 }
109}
110
111impl<'de> IntoDeserializer<'de, Error> for Owned {
112 type Deserializer = Deserializer<'de>;
113
114 fn into_deserializer(self) -> Self::Deserializer {
115 self.0.into_deserializer()
116 }
117}
118
119impl<'de> IntoDeserializer<'de, Error> for Ref<'de> {
120 type Deserializer = Deserializer<'de>;
121
122 fn into_deserializer(self) -> Self::Deserializer {
123 self.0.into_deserializer()
124 }
125}
126
127impl<'de> IntoDeserializer<'de, Error> for Value<'de> {
128 type Deserializer = Deserializer<'de>;
129
130 fn into_deserializer(self) -> Self::Deserializer {
131 Deserializer(self)
132 }
133}
134
135struct Seq<'de>(vec::IntoIter<Value<'de>>);
136
137impl<'de> Seq<'de> {
138 fn new(fields: Box<[Value<'de>]>) -> Self {
139 Seq(fields.into_vec().into_iter())
140 }
141}
142
143impl<'de> de::SeqAccess<'de> for Seq<'de> {
144 type Error = Error;
145
146 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
147 where
148 T: de::DeserializeSeed<'de>,
149 {
150 self.0
151 .next()
152 .map(|field| seed.deserialize(Deserializer(field)))
153 .transpose()
154 }
155}
156
157struct Map<'de, K: IntoDeserializer<'de, E>, E: de::Error> {
158 remaining: vec::IntoIter<(K, Value<'de>)>,
159 value: Option<Value<'de>>,
160 _m: PhantomData<E>,
161}
162
163impl<'de> Map<'de, &'de str, de::value::Error> {
164 fn new_str_key(fields: Box<[(&'de str, Value<'de>)]>) -> Self {
165 Map::new(fields)
166 }
167}
168
169impl<'de, K: IntoDeserializer<'de, E>, E: de::Error> Map<'de, K, E> {
170 fn new(fields: Box<[(K, Value<'de>)]>) -> Self {
171 Map {
172 remaining: fields.into_vec().into_iter(),
173 value: None,
174 _m: PhantomData,
175 }
176 }
177}
178
179impl<'de, K: IntoDeserializer<'de, E>, E: de::Error> de::MapAccess<'de> for Map<'de, K, E> {
180 type Error = Error;
181
182 fn next_key_seed<D>(&mut self, seed: D) -> Result<Option<D::Value>, Self::Error>
183 where
184 D: de::DeserializeSeed<'de>,
185 {
186 if let Some((k, v)) = self.remaining.next() {
187 self.value = Some(v);
188
189 Ok(Some(
190 seed.deserialize(k.into_deserializer())
191 .map_err(Error::custom)?,
192 ))
193 } else {
194 Ok(None)
195 }
196 }
197
198 fn next_value_seed<D>(&mut self, seed: D) -> Result<D::Value, Self::Error>
199 where
200 D: de::DeserializeSeed<'de>,
201 {
202 seed.deserialize(Deserializer(
203 self.value
204 .take()
205 .ok_or_else(|| Error::custom("missing map value"))?,
206 ))
207 }
208}
209
210struct Enum<'de> {
211 variant_index: u32,
212 variant: &'static str,
213 value: Variant<'de>,
214}
215
216enum Variant<'de> {
217 Value(Value<'de>),
218 Tuple(Box<[Value<'de>]>),
219 Struct(Box<[(&'static str, Value<'de>)]>),
220}
221
222impl<'de> de::EnumAccess<'de> for Enum<'de> {
223 type Error = Error;
224
225 type Variant = Self;
226
227 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
228 where
229 V: de::DeserializeSeed<'de>,
230 {
231 Ok((
232 seed.deserialize(Deserializer(Value::U32(self.variant_index)))?,
233 self,
234 ))
235 }
236}
237
238impl<'de> de::VariantAccess<'de> for Enum<'de> {
239 type Error = Error;
240
241 fn unit_variant(self) -> Result<(), Self::Error> {
242 match self.value {
243 Variant::Value(Value::Unit) => Ok(()),
244 Variant::Value(_) => Err(Error::invalid_type(
245 Unexpected::UnitVariant,
246 &"newtype variant",
247 )),
248 Variant::Tuple(_) => Err(Error::invalid_type(
249 Unexpected::UnitVariant,
250 &"tuple variant",
251 )),
252 Variant::Struct(_) => Err(Error::invalid_type(
253 Unexpected::UnitVariant,
254 &"struct variant",
255 )),
256 }
257 }
258
259 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
260 where
261 T: de::DeserializeSeed<'de>,
262 {
263 let value = match self.value {
264 Variant::Value(v) => v,
265 Variant::Tuple(v) => Value::Tuple(v),
266 Variant::Struct(v) => Value::Struct {
267 name: self.variant,
268 fields: v,
269 },
270 };
271
272 seed.deserialize(Deserializer(value))
273 }
274
275 fn tuple_variant<V>(self, _: usize, visitor: V) -> Result<V::Value, Self::Error>
276 where
277 V: Visitor<'de>,
278 {
279 match self.value {
280 Variant::Tuple(v) => visitor.visit_seq(Seq::new(v)),
281 Variant::Value(Value::Unit) => Err(Error::invalid_type(
282 Unexpected::UnitVariant,
283 &"tuple variant",
284 )),
285 Variant::Value(_) => Err(Error::invalid_type(
286 Unexpected::NewtypeVariant,
287 &"tuple variant",
288 )),
289 Variant::Struct(_) => Err(Error::invalid_type(
290 Unexpected::StructVariant,
291 &"tuple variant",
292 )),
293 }
294 }
295
296 fn struct_variant<V>(
297 self,
298 _: &'static [&'static str],
299 visitor: V,
300 ) -> Result<V::Value, Self::Error>
301 where
302 V: Visitor<'de>,
303 {
304 match self.value {
305 Variant::Struct(v) => visitor.visit_map(Map::new_str_key(v)),
306 Variant::Value(Value::Unit) => Err(Error::invalid_type(
307 Unexpected::UnitVariant,
308 &"struct variant",
309 )),
310 Variant::Value(_) => Err(Error::invalid_type(
311 Unexpected::NewtypeVariant,
312 &"struct variant",
313 )),
314 Variant::Tuple(_) => Err(Error::invalid_type(
315 Unexpected::TupleVariant,
316 &"struct variant",
317 )),
318 }
319 }
320}