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