1 use std::io::Write;
2 
3 use serde::ser::Serialize;
4 
5 use super::Serializer;
6 use crate::error::{Error, Result};
7 
8 pub struct TupleSerializer<'ser, W: 'ser + Write> {
9     ser: &'ser mut Serializer<W>,
10     must_close_tag: bool,
11     first: bool,
12 }
13 
14 impl<'ser, W: 'ser + Write> TupleSerializer<'ser, W> {
new(ser: &'ser mut Serializer<W>, must_close_tag: bool) -> Self15     pub fn new(ser: &'ser mut Serializer<W>, must_close_tag: bool) -> Self {
16         Self {
17             ser,
18             must_close_tag,
19             first: true,
20         }
21     }
22 
serialize_item<T>(&mut self, value: &T) -> Result<()> where T: ?Sized + Serialize,23     fn serialize_item<T>(&mut self, value: &T) -> Result<()>
24     where
25         T: ?Sized + Serialize,
26     {
27         if self.first {
28             self.first = false;
29         } else {
30             self.ser.characters(" ")?;
31         }
32         value.serialize(&mut *self.ser)?;
33         Ok(())
34     }
35 
after_items(self) -> Result<()>36     fn after_items(self) -> Result<()> {
37         if self.must_close_tag {
38             self.ser.end_tag()?;
39         }
40         Ok(())
41     }
42 }
43 
44 impl<'ser, W: 'ser + Write> serde::ser::SerializeTupleVariant for TupleSerializer<'ser, W> {
45     type Ok = ();
46     type Error = Error;
47 
serialize_field<T>(&mut self, value: &T) -> Result<()> where T: ?Sized + Serialize,48     fn serialize_field<T>(&mut self, value: &T) -> Result<()>
49     where
50         T: ?Sized + Serialize,
51     {
52         self.serialize_item(value)
53     }
54 
end(self) -> Result<()>55     fn end(self) -> Result<()> {
56         self.ser.end_tag()?;
57         self.after_items()
58     }
59 }
60 
61 impl<'ser, W: 'ser + Write> serde::ser::SerializeTupleStruct for TupleSerializer<'ser, W> {
62     type Ok = ();
63     type Error = Error;
64 
serialize_field<T>(&mut self, value: &T) -> Result<()> where T: ?Sized + Serialize,65     fn serialize_field<T>(&mut self, value: &T) -> Result<()>
66     where
67         T: ?Sized + Serialize,
68     {
69         self.serialize_item(value)
70     }
71 
end(self) -> Result<()>72     fn end(self) -> Result<()> {
73         self.after_items()
74     }
75 }
76 
77 impl<'ser, W: 'ser + Write> serde::ser::SerializeTuple for TupleSerializer<'ser, W> {
78     type Ok = ();
79     type Error = Error;
80 
serialize_element<T>(&mut self, value: &T) -> Result<()> where T: ?Sized + Serialize,81     fn serialize_element<T>(&mut self, value: &T) -> Result<()>
82     where
83         T: ?Sized + Serialize,
84     {
85         self.serialize_item(value)
86     }
87 
end(self) -> Result<()>88     fn end(self) -> Result<()> {
89         self.after_items()
90     }
91 }
92