1use crate::any::{Any, Error, Inner};
15use ordered_float::OrderedFloat;
16use serde::ser::{
17 Error as _, SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant,
18 SerializeTuple, SerializeTupleStruct, SerializeTupleVariant,
19};
20use serde::{Serialize, Serializer};
21use std::collections::BTreeMap;
22use std::f64;
23use std::fmt;
24
25impl Serialize for Any {
26 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
27 where
28 S: Serializer,
29 {
30 match &self.0 {
31 Inner::Null => serializer.serialize_unit(),
32 Inner::Bool(v) => serializer.serialize_bool(*v),
33 Inner::I8(v) => serializer.serialize_i8(*v),
34 Inner::I16(v) => serializer.serialize_i16(*v),
35 Inner::I32(v) => serializer.serialize_i32(*v),
36 Inner::I64(v) => serializer.serialize_i64(*v),
37 Inner::I128(v) => serializer.serialize_i128(*v),
38 Inner::U8(v) => serializer.serialize_u8(*v),
39 Inner::U16(v) => serializer.serialize_u16(*v),
40 Inner::U32(v) => serializer.serialize_u32(*v),
41 Inner::U64(v) => serializer.serialize_u64(*v),
42 Inner::U128(v) => serializer.serialize_u128(*v),
43 Inner::F32(v) => serializer.serialize_f32(v.0),
44 Inner::F64(v) => serializer.serialize_f64(v.0),
45 Inner::Char(v) => serializer.serialize_char(*v),
46 Inner::String(v) => serializer.serialize_str(v),
47 Inner::Bytes(v) => serializer.serialize_bytes(v),
48 Inner::Seq(v) => v.serialize(serializer),
49 Inner::Map(v) => v.serialize(serializer),
50 }
51 }
52}
53
54pub(crate) struct AnySerializer;
55
56impl Serializer for AnySerializer {
57 type Ok = Any;
58 type Error = Error;
59 type SerializeSeq = SeqSerializer;
60 type SerializeTuple = SeqSerializer;
61 type SerializeTupleStruct = SeqSerializer;
62 type SerializeTupleVariant = TupleVariantSerializer;
63 type SerializeMap = MapSerializer;
64 type SerializeStruct = MapSerializer;
65 type SerializeStructVariant = StructVariantSerializer;
66
67 #[inline]
68 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
69 Ok(Any(Inner::Bool(v)))
70 }
71
72 #[inline]
73 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
74 Ok(Any(Inner::I8(v)))
75 }
76
77 #[inline]
78 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
79 Ok(Any(Inner::I16(v)))
80 }
81
82 #[inline]
83 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
84 Ok(Any(Inner::I32(v)))
85 }
86
87 #[inline]
88 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
89 Ok(Any(Inner::I64(v)))
90 }
91
92 #[inline]
93 fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
94 Ok(Any(Inner::I128(v)))
95 }
96
97 #[inline]
98 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
99 Ok(Any(Inner::U8(v)))
100 }
101
102 #[inline]
103 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
104 Ok(Any(Inner::U16(v)))
105 }
106
107 #[inline]
108 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
109 Ok(Any(Inner::U32(v)))
110 }
111
112 #[inline]
113 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
114 Ok(Any(Inner::U64(v)))
115 }
116
117 #[inline]
118 fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
119 Ok(Any(Inner::U128(v)))
120 }
121
122 #[inline]
123 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
124 Ok(Any(Inner::F32(OrderedFloat(v))))
125 }
126
127 #[inline]
128 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
129 Ok(Any(Inner::F64(OrderedFloat(v))))
130 }
131
132 #[inline]
133 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
134 Ok(Any(Inner::String(v.to_string())))
135 }
136
137 #[inline]
138 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
139 Ok(Any(Inner::String(v.to_string())))
140 }
141
142 #[inline]
143 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
144 Ok(Any(Inner::Bytes(v.to_vec())))
145 }
146
147 #[inline]
148 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
149 Ok(Any(Inner::Null))
150 }
151
152 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
153 where
154 T: ?Sized + Serialize,
155 {
156 value.serialize(self)
157 }
158
159 #[inline]
160 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
161 Ok(Any(Inner::Null))
162 }
163
164 #[inline]
165 fn serialize_unit_struct(self, _: &'static str) -> Result<Self::Ok, Self::Error> {
166 self.serialize_unit()
167 }
168
169 #[inline]
170 fn serialize_unit_variant(
171 self,
172 _: &'static str,
173 _: u32,
174 variant: &'static str,
175 ) -> Result<Self::Ok, Self::Error> {
176 self.serialize_str(variant)
177 }
178
179 fn serialize_newtype_struct<T>(
180 self,
181 _: &'static str,
182 value: &T,
183 ) -> Result<Self::Ok, Self::Error>
184 where
185 T: ?Sized + Serialize,
186 {
187 value.serialize(self)
188 }
189
190 fn serialize_newtype_variant<T>(
191 self,
192 _: &'static str,
193 _: u32,
194 variant: &'static str,
195 value: &T,
196 ) -> Result<Self::Ok, Self::Error>
197 where
198 T: ?Sized + Serialize,
199 {
200 let mut map = BTreeMap::new();
201 let value = value.serialize(self)?;
202 map.insert(Any(Inner::String(variant.to_string())), value);
203 Ok(Any(Inner::Map(map)))
204 }
205
206 #[inline]
207 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
208 Ok(SeqSerializer(Vec::with_capacity(len.unwrap_or(0))))
209 }
210
211 #[inline]
212 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
213 self.serialize_seq(Some(len))
214 }
215
216 #[inline]
217 fn serialize_tuple_struct(
218 self,
219 _: &'static str,
220 len: usize,
221 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
222 self.serialize_seq(Some(len))
223 }
224
225 #[inline]
226 fn serialize_tuple_variant(
227 self,
228 _: &'static str,
229 _: u32,
230 variant: &'static str,
231 len: usize,
232 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
233 Ok(TupleVariantSerializer {
234 variant,
235 vec: Vec::with_capacity(len),
236 })
237 }
238
239 #[inline]
240 fn serialize_map(self, _: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
241 Ok(MapSerializer {
242 map: BTreeMap::new(),
243 key: None,
244 })
245 }
246
247 #[inline]
248 fn serialize_struct(
249 self,
250 _: &'static str,
251 len: usize,
252 ) -> Result<Self::SerializeStruct, Self::Error> {
253 self.serialize_map(Some(len))
254 }
255
256 #[inline]
257 fn serialize_struct_variant(
258 self,
259 _: &'static str,
260 _: u32,
261 variant: &'static str,
262 _: usize,
263 ) -> Result<Self::SerializeStructVariant, Self::Error> {
264 Ok(StructVariantSerializer {
265 variant,
266 map: BTreeMap::new(),
267 })
268 }
269
270 fn collect_str<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
271 where
272 T: ?Sized + fmt::Display,
273 {
274 Ok(Any(Inner::String(value.to_string())))
275 }
276}
277
278pub(crate) struct SeqSerializer(Vec<Any>);
279
280impl SerializeSeq for SeqSerializer {
281 type Ok = Any;
282 type Error = Error;
283
284 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
285 where
286 T: ?Sized + Serialize,
287 {
288 let value = Any::new(value)?;
289 self.0.push(value);
290 Ok(())
291 }
292
293 #[inline]
294 fn end(self) -> Result<Self::Ok, Self::Error> {
295 Ok(Any(Inner::Seq(self.0)))
296 }
297}
298
299impl SerializeTuple for SeqSerializer {
300 type Ok = Any;
301 type Error = Error;
302
303 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
304 where
305 T: ?Sized + Serialize,
306 {
307 SerializeSeq::serialize_element(self, value)
308 }
309
310 #[inline]
311 fn end(self) -> Result<Self::Ok, Self::Error> {
312 SerializeSeq::end(self)
313 }
314}
315
316impl SerializeTupleStruct for SeqSerializer {
317 type Ok = Any;
318 type Error = Error;
319
320 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
321 where
322 T: ?Sized + Serialize,
323 {
324 SerializeSeq::serialize_element(self, value)
325 }
326
327 #[inline]
328 fn end(self) -> Result<Self::Ok, Self::Error> {
329 SerializeSeq::end(self)
330 }
331}
332
333pub(crate) struct TupleVariantSerializer {
334 variant: &'static str,
335 vec: Vec<Any>,
336}
337
338impl SerializeTupleVariant for TupleVariantSerializer {
339 type Ok = Any;
340 type Error = Error;
341
342 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
343 where
344 T: ?Sized + Serialize,
345 {
346 let value = Any::new(value)?;
347 self.vec.push(value);
348 Ok(())
349 }
350
351 #[inline]
352 fn end(self) -> Result<Self::Ok, Self::Error> {
353 let mut out = BTreeMap::new();
354 out.insert(
355 Any(Inner::String(self.variant.to_string())),
356 Any(Inner::Seq(self.vec)),
357 );
358 Ok(Any(Inner::Map(out)))
359 }
360}
361
362pub(crate) struct MapSerializer {
363 map: BTreeMap<Any, Any>,
364 key: Option<Any>,
365}
366
367impl SerializeMap for MapSerializer {
368 type Ok = Any;
369 type Error = Error;
370
371 fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>
372 where
373 T: ?Sized + Serialize,
374 {
375 let key = key.serialize(AnySerializer)?;
376 self.key = Some(key);
377 Ok(())
378 }
379
380 fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
381 where
382 T: ?Sized + Serialize,
383 {
384 let key = match self.key.take() {
385 Some(key) => key,
386 None => return Err(Error::custom("key missing")),
387 };
388
389 let value = value.serialize(AnySerializer)?;
390 self.map.insert(key, value);
391
392 Ok(())
393 }
394
395 fn end(self) -> Result<Self::Ok, Self::Error> {
396 Ok(Any(Inner::Map(self.map)))
397 }
398}
399
400impl SerializeStruct for MapSerializer {
401 type Ok = Any;
402 type Error = Error;
403
404 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
405 where
406 T: ?Sized + Serialize,
407 {
408 SerializeMap::serialize_entry(self, key, value)
409 }
410
411 fn end(self) -> Result<Self::Ok, Self::Error> {
412 SerializeMap::end(self)
413 }
414}
415
416pub(crate) struct StructVariantSerializer {
417 variant: &'static str,
418 map: BTreeMap<Any, Any>,
419}
420
421impl SerializeStructVariant for StructVariantSerializer {
422 type Ok = Any;
423 type Error = Error;
424
425 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
426 where
427 T: ?Sized + Serialize,
428 {
429 let key = key.serialize(AnySerializer)?;
430 let value = value.serialize(AnySerializer)?;
431 self.map.insert(key, value);
432 Ok(())
433 }
434
435 fn end(self) -> Result<Self::Ok, Self::Error> {
436 let mut out = BTreeMap::new();
437 out.insert(
438 Any(Inner::String(self.variant.to_string())),
439 Any(Inner::Map(self.map)),
440 );
441 Ok(Any(Inner::Map(out)))
442 }
443}