1 mod map;
2 mod plain;
3 mod seq;
4 mod tuple;
5 
6 use self::{
7     map::{MapSerializer, StructSerializer},
8     seq::SeqSeralizer,
9     tuple::TupleSerializer,
10 };
11 use crate::error::{Error, Result};
12 use log::debug;
13 use serde::ser::Serialize;
14 use std::{collections::HashMap, io::Write};
15 use xml::writer::{EmitterConfig, EventWriter, XmlEvent};
16 
17 /// A convenience method for serializing some object to a buffer.
18 ///
19 /// # Examples
20 ///
21 /// ```rust
22 /// # use serde::Serialize;
23 /// # use serde_xml_rs::to_writer;
24 /// #[derive(Serialize)]
25 /// struct Person {
26 ///   name: String,
27 ///   age: u32,
28 /// }
29 ///
30 /// # fn main() {
31 /// let mut buffer = Vec::new();
32 /// let joe = Person {name: "Joe".to_string(), age: 42};
33 ///
34 /// to_writer(&mut buffer, &joe).unwrap();
35 ///
36 /// let serialized = String::from_utf8(buffer).unwrap();
37 /// println!("{}", serialized);
38 /// # }
39 /// ```
to_writer<W: Write, S: Serialize>(writer: W, value: &S) -> Result<()>40 pub fn to_writer<W: Write, S: Serialize>(writer: W, value: &S) -> Result<()> {
41     let mut ser = Serializer::new(writer);
42     value.serialize(&mut ser)
43 }
44 
45 /// A convenience method for serializing some object to a string.
46 ///
47 /// # Examples
48 ///
49 /// ```rust
50 /// # use serde::Serialize;
51 /// # use serde_xml_rs::to_string;
52 /// #[derive(Serialize)]
53 /// struct Person {
54 ///   name: String,
55 ///   age: u32,
56 /// }
57 ///
58 /// # fn main() {
59 ///
60 /// let joe = Person {name: "Joe".to_string(), age: 42};
61 /// let serialized = to_string(&joe).unwrap();
62 /// println!("{}", serialized);
63 /// # }
64 /// ```
to_string<S: Serialize>(value: &S) -> Result<String>65 pub fn to_string<S: Serialize>(value: &S) -> Result<String> {
66     // Create a buffer and serialize our nodes into it
67     let mut writer = Vec::with_capacity(128);
68     to_writer(&mut writer, value)?;
69 
70     // We then check that the serialized string is the same as what we expect
71     let string = String::from_utf8(writer)?;
72     Ok(string)
73 }
74 
75 /// An XML `Serializer`.
76 pub struct Serializer<W>
77 where
78     W: Write,
79 {
80     writer: EventWriter<W>,
81     root: bool,
82     current_tag: String,
83     current_tag_attrs: Option<HashMap<&'static str, String>>,
84 }
85 
86 impl<W> Serializer<W>
87 where
88     W: Write,
89 {
new_from_writer(writer: EventWriter<W>) -> Self90     fn new_from_writer(writer: EventWriter<W>) -> Self {
91         Self {
92             writer,
93             root: true,
94             current_tag: "".into(),
95             current_tag_attrs: None,
96         }
97     }
98 
new(writer: W) -> Self99     pub fn new(writer: W) -> Self {
100         Self::new_from_writer(EmitterConfig::new().create_writer(writer))
101     }
102 
next(&mut self, event: XmlEvent) -> Result<()>103     fn next(&mut self, event: XmlEvent) -> Result<()> {
104         self.writer.write(event)?;
105         Ok(())
106     }
107 
characters(&mut self, s: &str) -> Result<()>108     fn characters(&mut self, s: &str) -> Result<()> {
109         self.next(XmlEvent::characters(s))
110     }
111 
start_document(&mut self) -> Result<()>112     fn start_document(&mut self) -> Result<()> {
113         self.next(XmlEvent::StartDocument {
114             encoding: Default::default(),
115             standalone: Default::default(),
116             version: xml::common::XmlVersion::Version10,
117         })
118     }
119 
open_root_tag(&mut self, name: &'static str) -> Result<()>120     fn open_root_tag(&mut self, name: &'static str) -> Result<()> {
121         if self.root {
122             self.root = false;
123             self.start_document()?;
124             self.open_tag(name)?;
125         }
126         Ok(())
127     }
128 
open_tag(&mut self, tag_name: &str) -> Result<()>129     fn open_tag(&mut self, tag_name: &str) -> Result<()> {
130         self.current_tag = tag_name.into();
131         self.current_tag_attrs = Some(HashMap::new());
132         Ok(())
133     }
134 
reopen_tag(&mut self) -> Result<()>135     fn reopen_tag(&mut self) -> Result<()> {
136         self.current_tag_attrs = Some(HashMap::new());
137         Ok(())
138     }
139 
abandon_tag(&mut self) -> Result<()>140     fn abandon_tag(&mut self) -> Result<()> {
141         self.current_tag = "".into();
142         self.current_tag_attrs = None;
143         Ok(())
144     }
145 
add_attr(&mut self, name: &'static str, value: String) -> Result<()>146     fn add_attr(&mut self, name: &'static str, value: String) -> Result<()> {
147         self.current_tag_attrs
148             .as_mut()
149             .ok_or(Error::Custom {
150                 field: format!("Cannot add attribute {}", name),
151             })
152             .map(|attrs| {
153                 attrs.insert(name, value);
154             })
155     }
156 
build_start_tag(&mut self) -> Result<bool>157     fn build_start_tag(&mut self) -> Result<bool> {
158         if let Some(attrs) = self.current_tag_attrs.take() {
159             self.start_tag(&self.current_tag(), attrs)?;
160             Ok(true)
161         } else {
162             Ok(false)
163         }
164     }
165 
start_tag(&mut self, tag_name: &str, attrs: HashMap<&str, String>) -> Result<()>166     fn start_tag(&mut self, tag_name: &str, attrs: HashMap<&str, String>) -> Result<()> {
167         let element = attrs
168             .iter()
169             .fold(XmlEvent::start_element(tag_name), |b, (&name, value)| {
170                 b.attr(name, value)
171             });
172 
173         self.next(element.into())
174     }
175 
end_tag(&mut self) -> Result<()>176     fn end_tag(&mut self) -> Result<()> {
177         self.next(XmlEvent::end_element().into())
178     }
179 
current_tag(&self) -> String180     fn current_tag(&self) -> String {
181         self.current_tag.clone()
182     }
183 }
184 
185 impl<'ser, W: Write> serde::ser::Serializer for &'ser mut Serializer<W> {
186     type Ok = ();
187     type Error = Error;
188 
189     type SerializeSeq = SeqSeralizer<'ser, W>;
190     type SerializeTuple = TupleSerializer<'ser, W>;
191     type SerializeTupleStruct = TupleSerializer<'ser, W>;
192     type SerializeTupleVariant = TupleSerializer<'ser, W>;
193     type SerializeMap = MapSerializer<'ser, W>;
194     type SerializeStruct = StructSerializer<'ser, W>;
195     type SerializeStructVariant = StructSerializer<'ser, W>;
196 
serialize_bool(self, v: bool) -> Result<Self::Ok>197     fn serialize_bool(self, v: bool) -> Result<Self::Ok> {
198         self.serialize_str(&v.to_string())
199     }
200 
serialize_i8(self, v: i8) -> Result<Self::Ok>201     fn serialize_i8(self, v: i8) -> Result<Self::Ok> {
202         self.serialize_i64(i64::from(v))
203     }
204 
serialize_i16(self, v: i16) -> Result<Self::Ok>205     fn serialize_i16(self, v: i16) -> Result<Self::Ok> {
206         self.serialize_i64(i64::from(v))
207     }
208 
serialize_i32(self, v: i32) -> Result<Self::Ok>209     fn serialize_i32(self, v: i32) -> Result<Self::Ok> {
210         self.serialize_i64(i64::from(v))
211     }
212 
serialize_i64(self, v: i64) -> Result<Self::Ok>213     fn serialize_i64(self, v: i64) -> Result<Self::Ok> {
214         self.serialize_str(&v.to_string())
215     }
216 
serialize_u8(self, v: u8) -> Result<Self::Ok>217     fn serialize_u8(self, v: u8) -> Result<Self::Ok> {
218         self.serialize_u64(u64::from(v))
219     }
220 
serialize_u16(self, v: u16) -> Result<Self::Ok>221     fn serialize_u16(self, v: u16) -> Result<Self::Ok> {
222         self.serialize_u64(u64::from(v))
223     }
224 
serialize_u32(self, v: u32) -> Result<Self::Ok>225     fn serialize_u32(self, v: u32) -> Result<Self::Ok> {
226         self.serialize_u64(u64::from(v))
227     }
228 
serialize_u64(self, v: u64) -> Result<Self::Ok>229     fn serialize_u64(self, v: u64) -> Result<Self::Ok> {
230         let must_close_tag = self.build_start_tag()?;
231         self.characters(&v.to_string())?;
232         if must_close_tag {
233             self.end_tag()?;
234         }
235         Ok(())
236     }
237 
serialize_f32(self, v: f32) -> Result<Self::Ok>238     fn serialize_f32(self, v: f32) -> Result<Self::Ok> {
239         self.serialize_f64(f64::from(v))
240     }
241 
serialize_f64(self, v: f64) -> Result<Self::Ok>242     fn serialize_f64(self, v: f64) -> Result<Self::Ok> {
243         self.serialize_str(&v.to_string())
244     }
245 
serialize_char(self, v: char) -> Result<Self::Ok>246     fn serialize_char(self, v: char) -> Result<Self::Ok> {
247         self.serialize_str(&v.to_string())
248     }
249 
serialize_str(self, v: &str) -> Result<Self::Ok>250     fn serialize_str(self, v: &str) -> Result<Self::Ok> {
251         let must_close_tag = self.build_start_tag()?;
252         self.characters(v)?;
253         if must_close_tag {
254             self.end_tag()?;
255         }
256         Ok(())
257     }
258 
serialize_bytes(self, _v: &[u8]) -> Result<Self::Ok>259     fn serialize_bytes(self, _v: &[u8]) -> Result<Self::Ok> {
260         unimplemented!()
261     }
262 
serialize_none(self) -> Result<Self::Ok>263     fn serialize_none(self) -> Result<Self::Ok> {
264         debug!("None");
265         let must_close_tag = self.build_start_tag()?;
266         if must_close_tag {
267             self.end_tag()?;
268         }
269         Ok(())
270     }
271 
serialize_some<T: ?Sized>(self, value: &T) -> Result<Self::Ok> where T: Serialize,272     fn serialize_some<T: ?Sized>(self, value: &T) -> Result<Self::Ok>
273     where
274         T: Serialize,
275     {
276         debug!("Some");
277         value.serialize(self)
278     }
279 
serialize_unit(self) -> Result<Self::Ok>280     fn serialize_unit(self) -> Result<Self::Ok> {
281         debug!("Unit");
282         let must_close_tag = self.build_start_tag()?;
283         if must_close_tag {
284             self.end_tag()?;
285         }
286         Ok(())
287     }
288 
serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok>289     fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok> {
290         debug!("Unit struct {}", name);
291         self.serialize_unit()
292     }
293 
serialize_unit_variant( self, name: &'static str, _variant_index: u32, variant: &'static str, ) -> Result<Self::Ok>294     fn serialize_unit_variant(
295         self,
296         name: &'static str,
297         _variant_index: u32,
298         variant: &'static str,
299     ) -> Result<Self::Ok> {
300         debug!("Unit variant {}::{}", name, variant);
301         self.start_tag(variant, HashMap::new())?;
302         self.serialize_unit()?;
303         self.end_tag()?;
304         Ok(())
305     }
306 
serialize_newtype_struct<T: ?Sized>(self, name: &'static str, value: &T) -> Result<Self::Ok> where T: Serialize,307     fn serialize_newtype_struct<T: ?Sized>(self, name: &'static str, value: &T) -> Result<Self::Ok>
308     where
309         T: Serialize,
310     {
311         debug!("Newtype struct {}", name);
312         value.serialize(self)
313     }
314 
serialize_newtype_variant<T: ?Sized>( self, name: &'static str, _variant_index: u32, variant: &'static str, value: &T, ) -> Result<Self::Ok> where T: Serialize,315     fn serialize_newtype_variant<T: ?Sized>(
316         self,
317         name: &'static str,
318         _variant_index: u32,
319         variant: &'static str,
320         value: &T,
321     ) -> Result<Self::Ok>
322     where
323         T: Serialize,
324     {
325         let must_close_tag = self.build_start_tag()?;
326 
327         debug!("Newtype variant {}::{}", name, variant);
328         self.open_tag(variant)?;
329         value.serialize(&mut *self)?;
330 
331         if must_close_tag {
332             self.end_tag()?;
333         }
334         Ok(())
335     }
336 
serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq>337     fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
338         debug!("Sequence");
339         Ok(SeqSeralizer::new(self))
340     }
341 
serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple>342     fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
343         debug!("Tuple");
344         let must_close_tag = self.build_start_tag()?;
345         Ok(TupleSerializer::new(self, must_close_tag))
346     }
347 
serialize_tuple_struct( self, name: &'static str, _len: usize, ) -> Result<Self::SerializeTupleStruct>348     fn serialize_tuple_struct(
349         self,
350         name: &'static str,
351         _len: usize,
352     ) -> Result<Self::SerializeTupleStruct> {
353         debug!("Tuple struct {}", name);
354         let must_close_tag = self.build_start_tag()?;
355         Ok(TupleSerializer::new(self, must_close_tag))
356     }
357 
serialize_tuple_variant( self, name: &'static str, _variant_index: u32, variant: &'static str, _len: usize, ) -> Result<Self::SerializeTupleVariant>358     fn serialize_tuple_variant(
359         self,
360         name: &'static str,
361         _variant_index: u32,
362         variant: &'static str,
363         _len: usize,
364     ) -> Result<Self::SerializeTupleVariant> {
365         debug!("Tuple variant {}::{}", name, variant);
366         let must_close_tag = self.build_start_tag()?;
367         self.start_tag(variant, HashMap::new())?;
368         Ok(TupleSerializer::new(self, must_close_tag))
369     }
370 
serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap>371     fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
372         let must_close_tag = self.build_start_tag()?;
373         Ok(MapSerializer::new(self, must_close_tag))
374     }
375 
serialize_struct(self, name: &'static str, _len: usize) -> Result<Self::SerializeStruct>376     fn serialize_struct(self, name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
377         self.open_root_tag(name)?;
378 
379         debug!("Struct {}", name);
380         Ok(StructSerializer::new(self, false))
381     }
382 
serialize_struct_variant( self, name: &'static str, _variant_index: u32, variant: &'static str, _len: usize, ) -> Result<Self::SerializeStructVariant>383     fn serialize_struct_variant(
384         self,
385         name: &'static str,
386         _variant_index: u32,
387         variant: &'static str,
388         _len: usize,
389     ) -> Result<Self::SerializeStructVariant> {
390         self.open_root_tag(name)?;
391 
392         debug!("Struct variant {}", variant);
393         let must_close_tag = self.build_start_tag()?;
394         self.open_tag(variant)?;
395         Ok(StructSerializer::new(self, must_close_tag))
396     }
397 }
398 
399 #[cfg(test)]
400 mod tests {
401     use super::*;
402     use serde::Serialize;
403 
404     #[test]
test_serialize_struct()405     fn test_serialize_struct() {
406         #[derive(Serialize)]
407         struct Person {
408             name: String,
409             age: u32,
410         }
411 
412         let bob = Person {
413             name: "Bob".to_string(),
414             age: 42,
415         };
416         let should_be = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Person><name>Bob</name><age>42</age></Person>";
417         let mut buffer = Vec::new();
418 
419         {
420             let mut ser = Serializer::new(&mut buffer);
421             bob.serialize(&mut ser).unwrap();
422         }
423 
424         let got = String::from_utf8(buffer).unwrap();
425         assert_eq!(got, should_be);
426     }
427 
428     #[test]
test_serialize_enum()429     fn test_serialize_enum() {
430         #[derive(Serialize)]
431         #[allow(dead_code)]
432         enum Node {
433             Boolean(bool),
434             Number(f64),
435             String(String),
436         }
437 
438         let mut buffer = Vec::new();
439         let should_be = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Boolean>true</Boolean>";
440 
441         {
442             let mut ser = Serializer::new(&mut buffer);
443             let node = Node::Boolean(true);
444             node.serialize(&mut ser).unwrap();
445         }
446 
447         let got = String::from_utf8(buffer).unwrap();
448         assert_eq!(got, should_be);
449     }
450 }
451