1use crate::{error::*, value::object::*};
2use serde::Serialize;
3
4pub fn serialize<T>(value: &T) -> Result<Object>
5where
6 T: Serialize + ?Sized,
7{
8 value.serialize(Serializer)
9}
10
11pub struct Serializer;
12
13impl serde::ser::Serializer for Serializer {
14 type Ok = Object;
15 type Error = Error;
16 type SerializeSeq = SeqSerializer;
17 type SerializeTuple = TupleSerializer;
18 type SerializeTupleStruct = TupleStructSerializer;
19 type SerializeTupleVariant = TupleVariantSerializer;
20 type SerializeMap = MapSerializer;
21 type SerializeStruct = StructSerializer;
22 type SerializeStructVariant = StructVariantSerializer;
23
24 fn serialize_bool(self, v: bool) -> Result<Self::Ok> {
25 Ok(Object::Bool(v))
26 }
27
28 fn serialize_i8(self, v: i8) -> Result<Self::Ok> {
29 Ok(Object::Number(Number::SignedInteger(v as _)))
30 }
31
32 fn serialize_i16(self, v: i16) -> Result<Self::Ok> {
33 Ok(Object::Number(Number::SignedInteger(v as _)))
34 }
35
36 fn serialize_i32(self, v: i32) -> Result<Self::Ok> {
37 Ok(Object::Number(Number::SignedInteger(v as _)))
38 }
39
40 fn serialize_i64(self, v: i64) -> Result<Self::Ok> {
41 Ok(Object::Number(Number::SignedInteger(v)))
42 }
43
44 fn serialize_u8(self, v: u8) -> Result<Self::Ok> {
45 Ok(Object::Number(Number::UnsignedInteger(v as _)))
46 }
47
48 fn serialize_u16(self, v: u16) -> Result<Self::Ok> {
49 Ok(Object::Number(Number::UnsignedInteger(v as _)))
50 }
51
52 fn serialize_u32(self, v: u32) -> Result<Self::Ok> {
53 Ok(Object::Number(Number::UnsignedInteger(v as _)))
54 }
55
56 fn serialize_u64(self, v: u64) -> Result<Self::Ok> {
57 Ok(Object::Number(Number::UnsignedInteger(v)))
58 }
59
60 fn serialize_f32(self, v: f32) -> Result<Self::Ok> {
61 Ok(Object::Number(Number::Float(v as _)))
62 }
63
64 fn serialize_f64(self, v: f64) -> Result<Self::Ok> {
65 Ok(Object::Number(Number::Float(v)))
66 }
67
68 fn serialize_char(self, v: char) -> Result<Self::Ok> {
69 Ok(Object::String(v.to_string()))
70 }
71
72 fn serialize_str(self, v: &str) -> Result<Self::Ok> {
73 Ok(Object::String(v.to_owned()))
74 }
75
76 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok> {
77 Ok(Object::Array(
78 v.iter()
79 .map(|v| Object::Number(Number::UnsignedInteger(*v as _)))
80 .collect(),
81 ))
82 }
83
84 fn serialize_none(self) -> Result<Self::Ok> {
85 Ok(Object::Option(None))
86 }
87
88 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok>
89 where
90 T: ?Sized + Serialize,
91 {
92 Ok(Object::Option(Some(Box::new(value.serialize(self)?))))
93 }
94
95 fn serialize_unit(self) -> Result<Self::Ok> {
96 Ok(Object::Unit)
97 }
98
99 fn serialize_unit_struct(self, _: &'static str) -> Result<Self::Ok> {
100 Ok(Object::Unit)
101 }
102
103 fn serialize_unit_variant(
104 self,
105 _: &'static str,
106 _: u32,
107 variant: &'static str,
108 ) -> Result<Self::Ok> {
109 Ok(Object::Variant {
110 name: variant.to_owned(),
111 value: Box::new(Variant::Unit),
112 })
113 }
114
115 fn serialize_newtype_struct<T>(self, _: &'static str, value: &T) -> Result<Self::Ok>
116 where
117 T: ?Sized + Serialize,
118 {
119 Ok(Object::Wrapper(Box::new(value.serialize(self)?)))
120 }
121
122 fn serialize_newtype_variant<T>(
123 self,
124 _: &'static str,
125 _: u32,
126 variant: &'static str,
127 value: &T,
128 ) -> Result<Self::Ok>
129 where
130 T: ?Sized + Serialize,
131 {
132 Ok(Object::Variant {
133 name: variant.to_owned(),
134 value: Box::new(Variant::Wrapper(Box::new(value.serialize(self)?))),
135 })
136 }
137
138 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq> {
139 Ok(SeqSerializer {
140 values: match len {
141 Some(len) => Vec::with_capacity(len),
142 None => vec![],
143 },
144 })
145 }
146
147 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple> {
148 Ok(TupleSerializer {
149 values: Vec::with_capacity(len),
150 })
151 }
152
153 fn serialize_tuple_struct(
154 self,
155 _: &'static str,
156 len: usize,
157 ) -> Result<Self::SerializeTupleStruct> {
158 Ok(TupleStructSerializer {
159 values: Vec::with_capacity(len),
160 })
161 }
162
163 fn serialize_tuple_variant(
164 self,
165 _: &'static str,
166 _: u32,
167 variant: &'static str,
168 len: usize,
169 ) -> Result<Self::SerializeTupleVariant> {
170 Ok(TupleVariantSerializer {
171 variant: variant.to_owned(),
172 values: Vec::with_capacity(len),
173 })
174 }
175
176 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap> {
177 Ok(MapSerializer {
178 values: match len {
179 Some(len) => Vec::with_capacity(len),
180 None => vec![],
181 },
182 })
183 }
184
185 fn serialize_struct(self, _: &'static str, len: usize) -> Result<Self::SerializeStruct> {
186 Ok(StructSerializer {
187 values: Vec::with_capacity(len),
188 })
189 }
190
191 fn serialize_struct_variant(
192 self,
193 _: &'static str,
194 _: u32,
195 variant: &'static str,
196 len: usize,
197 ) -> Result<Self::SerializeStructVariant> {
198 Ok(StructVariantSerializer {
199 variant: variant.to_owned(),
200 values: Vec::with_capacity(len),
201 })
202 }
203}
204
205pub struct SeqSerializer {
206 values: Vec<Object>,
207}
208
209impl serde::ser::SerializeSeq for SeqSerializer {
210 type Ok = Object;
211 type Error = Error;
212
213 fn serialize_element<T>(&mut self, value: &T) -> Result<()>
214 where
215 T: ?Sized + Serialize,
216 {
217 self.values.push(value.serialize(Serializer)?);
218 Ok(())
219 }
220
221 fn end(self) -> Result<Self::Ok> {
222 Ok(Object::Array(self.values))
223 }
224}
225
226pub struct TupleSerializer {
227 values: Vec<Object>,
228}
229
230impl serde::ser::SerializeTuple for TupleSerializer {
231 type Ok = Object;
232 type Error = Error;
233
234 fn serialize_element<T>(&mut self, value: &T) -> Result<()>
235 where
236 T: ?Sized + Serialize,
237 {
238 self.values.push(value.serialize(Serializer)?);
239 Ok(())
240 }
241
242 fn end(self) -> Result<Self::Ok> {
243 Ok(Object::Array(self.values))
244 }
245}
246
247pub struct TupleStructSerializer {
248 values: Vec<Object>,
249}
250
251impl serde::ser::SerializeTupleStruct for TupleStructSerializer {
252 type Ok = Object;
253 type Error = Error;
254
255 fn serialize_field<T>(&mut self, value: &T) -> Result<()>
256 where
257 T: ?Sized + Serialize,
258 {
259 self.values.push(value.serialize(Serializer)?);
260 Ok(())
261 }
262
263 fn end(self) -> Result<Self::Ok> {
264 Ok(Object::Array(self.values))
265 }
266}
267
268pub struct TupleVariantSerializer {
269 variant: String,
270 values: Vec<Object>,
271}
272
273impl serde::ser::SerializeTupleVariant for TupleVariantSerializer {
274 type Ok = Object;
275 type Error = Error;
276
277 fn serialize_field<T>(&mut self, value: &T) -> Result<()>
278 where
279 T: ?Sized + Serialize,
280 {
281 self.values.push(value.serialize(Serializer)?);
282 Ok(())
283 }
284
285 fn end(self) -> Result<Self::Ok> {
286 Ok(Object::Variant {
287 name: self.variant,
288 value: Box::new(Variant::Array(self.values)),
289 })
290 }
291}
292
293pub struct MapSerializer {
294 values: Vec<(Object, Object)>,
295}
296
297impl serde::ser::SerializeMap for MapSerializer {
298 type Ok = Object;
299 type Error = Error;
300
301 fn serialize_key<T>(&mut self, key: &T) -> Result<()>
302 where
303 T: ?Sized + Serialize,
304 {
305 self.values.push((key.serialize(Serializer)?, Object::Unit));
306 Ok(())
307 }
308
309 fn serialize_value<T>(&mut self, value: &T) -> Result<()>
310 where
311 T: ?Sized + Serialize,
312 {
313 self.values.last_mut().unwrap().1 = value.serialize(Serializer)?;
314 Ok(())
315 }
316
317 fn serialize_entry<K, V>(&mut self, key: &K, value: &V) -> Result<()>
318 where
319 K: ?Sized + Serialize,
320 V: ?Sized + Serialize,
321 {
322 self.values
323 .push((key.serialize(Serializer)?, value.serialize(Serializer)?));
324 Ok(())
325 }
326
327 fn end(self) -> Result<Self::Ok> {
328 Ok(Object::Map(self.values))
329 }
330}
331
332pub struct StructSerializer {
333 values: Vec<(Object, Object)>,
334}
335
336impl serde::ser::SerializeStruct for StructSerializer {
337 type Ok = Object;
338 type Error = Error;
339
340 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
341 where
342 T: ?Sized + Serialize,
343 {
344 self.values
345 .push((Object::String(key.to_owned()), value.serialize(Serializer)?));
346 Ok(())
347 }
348
349 fn end(self) -> Result<Object> {
350 Ok(Object::Map(self.values))
351 }
352}
353
354pub struct StructVariantSerializer {
355 variant: String,
356 values: Vec<(String, Object)>,
357}
358
359impl serde::ser::SerializeStructVariant for StructVariantSerializer {
360 type Ok = Object;
361 type Error = Error;
362
363 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
364 where
365 T: ?Sized + Serialize,
366 {
367 self.values
368 .push((key.to_owned(), value.serialize(Serializer)?));
369 Ok(())
370 }
371
372 fn end(self) -> Result<Object> {
373 Ok(Object::Variant {
374 name: self.variant,
375 value: Box::new(Variant::Map(self.values)),
376 })
377 }
378}