1use std::io::{BufWriter, Write};
2
3use serde::Serialize;
4
5use super::error::Error;
6
7#[inline]
9pub fn to_writer<W: Write, S: Serialize>(writer: W, value: &S) -> Result<(), Error> {
10 value.serialize(&mut Serializer::new(writer))
11}
12
13pub fn to_string<S: Serialize>(value: &S) -> Result<String, Error> {
15 let mut writer = Vec::new();
16 to_writer(&mut writer, value)?;
17 String::from_utf8(writer).map_err(Into::into)
18}
19
20macro_rules! unsupport_type {
21 ($type_:expr) => {
22 Error::UnsupportedOperation {
23 operation: format!("Serializing {}", $type_),
24 }
25 };
26}
27
28macro_rules! serialize_num_attr {
29 ($name:ident, $type_:tt) => {
30 #[inline]
31 fn $name(self, v: $type_) -> Result<Self::Ok, Self::Error> {
32 self.serialize_str(&v.to_string())
33 }
34 };
35}
36
37struct Serializer<W>
38where
39 W: Write,
40{
41 writer: BufWriter<W>,
42 tags: Vec<&'static str>,
43}
44
45#[allow(unused)]
46impl<W> Serializer<W>
47where
48 W: Write,
49{
50 fn new(writer: W) -> Self {
51 Self {
52 writer: BufWriter::new(writer),
53 tags: vec![],
54 }
55 }
56
57 fn write_tag(&mut self) -> Result<(), Error> {
58 if let Some(tag) = self.tags.last() {
59 self.writer.write_fmt(format_args!("<{tag}>"))?;
60 Ok(())
61 } else {
62 Err(Error::Custom {
63 field: "serialize fail with empty tag".to_owned(),
64 })
65 }
66 }
67
68 fn write_close_tag(&mut self) -> Result<(), Error> {
69 if let Some(tag) = self.tags.last() {
70 self.writer.write_fmt(format_args!("</{tag}>"))?;
71 Ok(())
72 } else {
73 Err(Error::Custom {
74 field: "serialize fail with empty /tag".to_owned(),
75 })
76 }
77 }
78}
79
80#[allow(unused)]
81impl<'ser, W: Write> serde::ser::Serializer for &'ser mut Serializer<W> {
82 type Ok = ();
83 type Error = Error;
84
85 type SerializeSeq = Self;
86
87 type SerializeTuple = Self;
88
89 type SerializeTupleStruct = Self;
90
91 type SerializeTupleVariant = Self;
92
93 type SerializeMap = Self;
94
95 type SerializeStruct = Self;
96
97 type SerializeStructVariant = Self;
98
99 serialize_num_attr!(serialize_bool, bool);
104 serialize_num_attr!(serialize_i8, i8);
105 serialize_num_attr!(serialize_i16, i16);
106 serialize_num_attr!(serialize_i32, i32);
107 serialize_num_attr!(serialize_i64, i64);
108 serialize_num_attr!(serialize_u8, u8);
109 serialize_num_attr!(serialize_u16, u16);
110 serialize_num_attr!(serialize_u32, u32);
111 serialize_num_attr!(serialize_u64, u64);
112 serialize_num_attr!(serialize_f32, f32);
113 serialize_num_attr!(serialize_f64, f64);
114 serialize_num_attr!(serialize_char, char);
115
116 #[inline]
117 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
118 self.serialize_bytes(v.as_bytes())
119 }
120
121 #[inline]
122 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
123 self.write_tag()?;
124 self.writer.write(v)?;
125 self.write_close_tag()?;
126 Ok(())
127 }
128
129 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
130 Ok(())
132 }
133
134 fn serialize_some<T: ?Sized>(self, value: &T) -> Result<Self::Ok, Self::Error>
135 where
136 T: serde::Serialize,
137 {
138 value.serialize(self)
139 }
140
141 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
143 Ok(())
145 }
146
147 fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error> {
149 Err(unsupport_type!("unit_struct"))
150 }
151
152 fn serialize_unit_variant(
154 self,
155 name: &'static str,
156 variant_index: u32,
157 variant: &'static str,
158 ) -> Result<Self::Ok, Self::Error> {
159 self.serialize_str(variant)
160 }
161
162 fn serialize_newtype_struct<T: ?Sized>(
164 self,
165 name: &'static str,
166 value: &T,
167 ) -> Result<Self::Ok, Self::Error>
168 where
169 T: serde::Serialize,
170 {
171 value.serialize(self)
172 }
173
174 fn serialize_newtype_variant<T: ?Sized>(
176 self,
177 name: &'static str,
178 variant_index: u32,
179 variant: &'static str,
180 value: &T,
181 ) -> Result<Self::Ok, Self::Error>
182 where
183 T: serde::Serialize,
184 {
185 Err(unsupport_type!("newtype_variant"))
186 }
187
188 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
189 Ok(self)
190 }
191
192 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
196 Err(unsupport_type!("tuple"))
197 }
198
199 fn serialize_tuple_struct(
201 self,
202 name: &'static str,
203 len: usize,
204 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
205 Err(unsupport_type!("tuple_struct"))
206 }
207
208 fn serialize_tuple_variant(
210 self,
211 name: &'static str,
212 variant_index: u32,
213 variant: &'static str,
214 len: usize,
215 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
216 Err(unsupport_type!("tuple_variant"))
217 }
218
219 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
220 Err(unsupport_type!("map"))
221 }
222
223 fn serialize_struct(
224 self,
225 name: &'static str,
226 len: usize,
227 ) -> Result<Self::SerializeStruct, Self::Error> {
228 if self.tags.len() == 0 {
229 self.tags.push(name);
230 }
231 self.write_tag();
232 Ok(self)
233 }
234
235 fn serialize_struct_variant(
237 self,
238 name: &'static str,
239 variant_index: u32,
240 variant: &'static str,
241 len: usize,
242 ) -> Result<Self::SerializeStructVariant, Self::Error> {
243 Err(unsupport_type!("struct_variant"))
244 }
245}
246
247impl<'ser, W: Write> serde::ser::SerializeSeq for &'ser mut Serializer<W> {
248 type Ok = ();
249
250 type Error = Error;
251
252 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
253 where
254 T: serde::Serialize,
255 {
256 value.serialize(&mut **self)
257 }
258
259 fn end(self) -> Result<Self::Ok, Self::Error> {
260 Ok(())
261 }
262}
263
264#[allow(unused)]
265impl<'ser, W: Write> serde::ser::SerializeMap for &'ser mut Serializer<W> {
266 type Ok = ();
267
268 type Error = Error;
269
270 fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error>
271 where
272 T: serde::Serialize,
273 {
274 Err(unsupport_type!("Map"))
275 }
276
277 fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
278 where
279 T: serde::Serialize,
280 {
281 Err(unsupport_type!("Map"))
282 }
283
284 fn end(self) -> Result<Self::Ok, Self::Error> {
285 Err(unsupport_type!("Map"))
286 }
287}
288
289#[allow(unused)]
290impl<'ser, W: Write> serde::ser::SerializeTuple for &'ser mut Serializer<W> {
291 type Ok = ();
292
293 type Error = Error;
294
295 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
296 where
297 T: serde::Serialize,
298 {
299 Err(unsupport_type!("Tuple"))
300 }
301
302 fn end(self) -> Result<Self::Ok, Self::Error> {
303 Err(unsupport_type!("Tuple"))
304 }
305}
306
307#[allow(unused)]
308impl<'ser, W: Write> serde::ser::SerializeTupleStruct for &'ser mut Serializer<W> {
309 type Ok = ();
310
311 type Error = Error;
312
313 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
314 where
315 T: serde::Serialize,
316 {
317 Err(unsupport_type!("TupleStruct"))
318 }
319
320 fn end(self) -> Result<Self::Ok, Self::Error> {
321 Err(unsupport_type!("TupleStruct"))
322 }
323}
324
325#[allow(unused)]
326impl<'ser, W: Write> serde::ser::SerializeTupleVariant for &'ser mut Serializer<W> {
327 type Ok = ();
328
329 type Error = Error;
330
331 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
332 where
333 T: serde::Serialize,
334 {
335 Err(unsupport_type!("TupleVariant"))
336 }
337
338 fn end(self) -> Result<Self::Ok, Self::Error> {
339 Err(unsupport_type!("TupleVariant"))
340 }
341}
342
343impl<'ser, W: Write> serde::ser::SerializeStruct for &'ser mut Serializer<W> {
344 type Ok = ();
345
346 type Error = Error;
347
348 fn serialize_field<T: ?Sized>(
349 &mut self,
350 key: &'static str,
351 value: &T,
352 ) -> Result<(), Self::Error>
353 where
354 T: serde::Serialize,
355 {
356 self.tags.push(key);
357 value.serialize(&mut **self)?;
358 self.tags.pop();
359 Ok(())
360 }
361
362 fn end(self) -> Result<Self::Ok, Self::Error> {
363 self.write_close_tag()
364 }
365}
366
367#[allow(unused)]
368impl<'ser, W: Write> serde::ser::SerializeStructVariant for &'ser mut Serializer<W> {
369 type Ok = ();
370
371 type Error = Error;
372
373 fn serialize_field<T: ?Sized>(
374 &mut self,
375 key: &'static str,
376 value: &T,
377 ) -> Result<(), Self::Error>
378 where
379 T: serde::Serialize,
380 {
381 Err(unsupport_type!("StructVariant"))
382 }
383
384 fn end(self) -> Result<Self::Ok, Self::Error> {
385 Err(unsupport_type!("StructVariant"))
386 }
387}