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