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