1mod var;
4
5use self::var::{Map, Seq, Struct, Tuple};
6use crate::{
7 de::PRIMITIVE_PREFIX,
8 errors::serialize::DeError,
9 events::{BytesEnd, BytesStart, BytesText, Event},
10 writer::Writer,
11};
12use serde::ser::{self, Serialize};
13use serde::serde_if_integer128;
14use std::io::Write;
15
16pub fn to_writer<W: Write, S: Serialize>(writer: W, value: &S) -> Result<(), DeError> {
18 let mut serializer = Serializer::new(writer);
19 value.serialize(&mut serializer)
20}
21
22pub fn to_string<S: Serialize>(value: &S) -> Result<String, DeError> {
24 let mut writer = Vec::new();
25 to_writer(&mut writer, value)?;
26 let s = String::from_utf8(writer).map_err(|e| crate::errors::Error::Utf8(e.utf8_error()))?;
27 Ok(s)
28}
29
30pub struct Serializer<'r, W: Write> {
32 writer: Writer<W>,
33 root_tag: Option<&'r str>,
35}
36
37impl<'r, W: Write> Serializer<'r, W> {
38 pub fn new(writer: W) -> Self {
44 Self::with_root(Writer::new(writer), None)
45 }
46
47 pub fn with_root(writer: Writer<W>, root_tag: Option<&'r str>) -> Self {
96 Self { writer, root_tag }
97 }
98
99 fn write_primitive<P: std::fmt::Display>(
100 &mut self,
101 value: P,
102 escaped: bool,
103 ) -> Result<(), DeError> {
104 let value = value.to_string().into_bytes();
105 let event = if escaped {
106 BytesText::from_escaped(value)
107 } else {
108 BytesText::from_plain(&value)
109 };
110 self.writer.write_event(Event::Text(event))?;
111 Ok(())
112 }
113
114 fn write_self_closed(&mut self, tag_name: &str) -> Result<(), DeError> {
116 self.writer
117 .write_event(Event::Empty(BytesStart::borrowed_name(tag_name.as_bytes())))?;
118 Ok(())
119 }
120
121 fn write_paired<T: ?Sized + Serialize>(
123 &mut self,
124 tag_name: &str,
125 value: &T,
126 ) -> Result<(), DeError> {
127 self.writer
128 .write_event(Event::Start(BytesStart::borrowed_name(tag_name.as_bytes())))?;
129 value.serialize(&mut *self)?;
130 self.writer
131 .write_event(Event::End(BytesEnd::borrowed(tag_name.as_bytes())))?;
132 Ok(())
133 }
134}
135
136impl<'r, 'w, W: Write> ser::Serializer for &'w mut Serializer<'r, W> {
137 type Ok = ();
138 type Error = DeError;
139
140 type SerializeSeq = Seq<'r, 'w, W>;
141 type SerializeTuple = Tuple<'r, 'w, W>;
142 type SerializeTupleStruct = Tuple<'r, 'w, W>;
143 type SerializeTupleVariant = Tuple<'r, 'w, W>;
144 type SerializeMap = Map<'r, 'w, W>;
145 type SerializeStruct = Struct<'r, 'w, W>;
146 type SerializeStructVariant = Struct<'r, 'w, W>;
147
148 fn serialize_bool(self, v: bool) -> Result<Self::Ok, DeError> {
149 self.write_primitive(if v { "true" } else { "false" }, true)
150 }
151
152 fn serialize_i8(self, v: i8) -> Result<Self::Ok, DeError> {
153 self.write_primitive(v, true)
154 }
155
156 fn serialize_i16(self, v: i16) -> Result<Self::Ok, DeError> {
157 self.write_primitive(v, true)
158 }
159
160 fn serialize_i32(self, v: i32) -> Result<Self::Ok, DeError> {
161 self.write_primitive(v, true)
162 }
163
164 fn serialize_i64(self, v: i64) -> Result<Self::Ok, DeError> {
165 self.write_primitive(v, true)
166 }
167
168 fn serialize_u8(self, v: u8) -> Result<Self::Ok, DeError> {
169 self.write_primitive(v, true)
170 }
171
172 fn serialize_u16(self, v: u16) -> Result<Self::Ok, DeError> {
173 self.write_primitive(v, true)
174 }
175
176 fn serialize_u32(self, v: u32) -> Result<Self::Ok, DeError> {
177 self.write_primitive(v, true)
178 }
179
180 fn serialize_u64(self, v: u64) -> Result<Self::Ok, DeError> {
181 self.write_primitive(v, true)
182 }
183
184 serde_if_integer128! {
185 fn serialize_i128(self, v: i128) -> Result<Self::Ok, DeError> {
186 self.write_primitive(v, true)
187 }
188
189 fn serialize_u128(self, v: u128) -> Result<Self::Ok, DeError> {
190 self.write_primitive(v, true)
191 }
192 }
193
194 fn serialize_f32(self, v: f32) -> Result<Self::Ok, DeError> {
195 self.write_primitive(v, true)
196 }
197
198 fn serialize_f64(self, v: f64) -> Result<Self::Ok, DeError> {
199 self.write_primitive(v, true)
200 }
201
202 fn serialize_char(self, v: char) -> Result<Self::Ok, DeError> {
203 self.write_primitive(v, false)
204 }
205
206 fn serialize_str(self, value: &str) -> Result<Self::Ok, DeError> {
207 self.write_primitive(value, false)
208 }
209
210 fn serialize_bytes(self, _value: &[u8]) -> Result<Self::Ok, DeError> {
211 Err(DeError::Unsupported("serialize_bytes"))
214 }
215
216 fn serialize_none(self) -> Result<Self::Ok, DeError> {
217 Ok(())
218 }
219
220 fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<Self::Ok, DeError> {
221 value.serialize(self)
222 }
223
224 fn serialize_unit(self) -> Result<Self::Ok, DeError> {
225 self.serialize_none()
226 }
227
228 fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, DeError> {
229 self.write_self_closed(self.root_tag.unwrap_or(name))
230 }
231
232 fn serialize_unit_variant(
233 self,
234 _name: &'static str,
235 _variant_index: u32,
236 variant: &'static str,
237 ) -> Result<Self::Ok, DeError> {
238 if variant.starts_with(PRIMITIVE_PREFIX) {
239 let variant = variant.split_at(PRIMITIVE_PREFIX.len()).1;
240 self.write_primitive(variant, false)
241 } else {
242 self.write_self_closed(variant)
243 }
244 }
245
246 fn serialize_newtype_struct<T: ?Sized + Serialize>(
247 self,
248 name: &'static str,
249 value: &T,
250 ) -> Result<Self::Ok, DeError> {
251 self.write_paired(self.root_tag.unwrap_or(name), value)
252 }
253
254 fn serialize_newtype_variant<T: ?Sized + Serialize>(
255 self,
256 _name: &'static str,
257 _variant_index: u32,
258 variant: &'static str,
259 value: &T,
260 ) -> Result<Self::Ok, DeError> {
261 let root = self.root_tag.take();
267 let result = self.write_paired(variant, value);
268 self.root_tag = root;
269 result
270 }
271
272 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, DeError> {
273 Ok(Seq::new(self))
274 }
275
276 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, DeError> {
277 let tag = match self.root_tag {
278 Some(tag) => tag,
279 None => {
280 return Err(DeError::Custom(
281 "root tag name must be specified when serialize unnamed tuple".into(),
282 ))
283 }
284 };
285 Ok(Tuple::new(self, tag))
286 }
287
288 fn serialize_tuple_struct(
289 self,
290 name: &'static str,
291 _len: usize,
292 ) -> Result<Self::SerializeTupleStruct, DeError> {
293 Ok(Tuple::new(self, self.root_tag.unwrap_or(name)))
294 }
295
296 fn serialize_tuple_variant(
297 self,
298 _name: &'static str,
299 _variant_index: u32,
300 variant: &'static str,
301 _len: usize,
302 ) -> Result<Self::SerializeTupleVariant, DeError> {
303 Ok(Tuple::new(self, variant))
304 }
305
306 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, DeError> {
307 if let Some(tag) = self.root_tag {
308 self.writer
310 .write_event(Event::Start(BytesStart::borrowed_name(tag.as_bytes())))?;
311 }
312 Ok(Map::new(self))
313 }
314
315 fn serialize_struct(
316 self,
317 name: &'static str,
318 _len: usize,
319 ) -> Result<Self::SerializeStruct, DeError> {
320 Ok(Struct::new(self, self.root_tag.unwrap_or(name)))
321 }
322
323 fn serialize_struct_variant(
324 self,
325 _name: &'static str,
326 _variant_index: u32,
327 variant: &'static str,
328 _len: usize,
329 ) -> Result<Self::SerializeStructVariant, DeError> {
330 Ok(Struct::new(self, variant))
331 }
332}
333
334#[cfg(test)]
335mod tests {
336 use super::*;
337 use pretty_assertions::assert_eq;
338 use serde::ser::SerializeMap;
339 use serde::{Serialize, Serializer as SerSerializer};
340
341 #[test]
342 fn test_serialize_bool() {
343 let inputs = vec![(true, "true"), (false, "false")];
344
345 for (src, should_be) in inputs {
346 let mut buffer = Vec::new();
347
348 {
349 let mut ser = Serializer::new(&mut buffer);
350 ser.serialize_bool(src).unwrap();
351 }
352
353 let got = String::from_utf8(buffer).unwrap();
354 assert_eq!(got, should_be);
355 }
356 }
357
358 #[test]
359 fn test_serialize_struct() {
360 #[derive(Serialize)]
361 struct Person {
362 name: String,
363 age: u32,
364 }
365
366 let bob = Person {
367 name: "Bob".to_string(),
368 age: 42,
369 };
370 let should_be = "<Person name=\"Bob\" age=\"42\"/>";
371 let mut buffer = Vec::new();
372
373 {
374 let mut ser = Serializer::new(&mut buffer);
375 bob.serialize(&mut ser).unwrap();
376 }
377
378 let got = String::from_utf8(buffer).unwrap();
379 assert_eq!(got, should_be);
380 }
381
382 #[test]
383 fn test_serialize_struct_value_number() {
384 #[derive(Serialize)]
385 struct Person {
386 name: String,
387 #[serde(rename = "$value")]
388 age: u32,
389 }
390
391 let bob = Person {
392 name: "Bob".to_string(),
393 age: 42,
394 };
395 let should_be = "<Person name=\"Bob\">42</Person>";
396 let got = to_string(&bob).unwrap();
397 assert_eq!(got, should_be);
398 }
399
400 #[test]
401 fn test_serialize_struct_value_string() {
402 #[derive(Serialize)]
403 struct Person {
404 name: String,
405 #[serde(rename = "$value")]
406 age: String,
407 }
408
409 let bob = Person {
410 name: "Bob".to_string(),
411 age: "42".to_string(),
412 };
413 let should_be = "<Person name=\"Bob\">42</Person>";
414 let got = to_string(&bob).unwrap();
415 assert_eq!(got, should_be);
416 }
417
418 #[test]
419 fn test_serialize_map_entries() {
420 let should_be = "<name>Bob</name><age>5</age>";
421 let mut buffer = Vec::new();
422
423 {
424 let mut ser = Serializer::new(&mut buffer);
425 let mut map = Map::new(&mut ser);
426 map.serialize_entry("name", "Bob").unwrap();
427 map.serialize_entry("age", "5").unwrap();
428 }
429
430 let got = String::from_utf8(buffer).unwrap();
431 assert_eq!(got, should_be);
432 }
433
434 #[test]
435 fn test_serialize_enum() {
436 #[derive(Serialize)]
437 #[allow(dead_code)]
438 enum Node {
439 Boolean(bool),
440 Number(f64),
441 String(String),
442 }
443
444 let mut buffer = Vec::new();
445 let should_be = "<Boolean>true</Boolean>";
446
447 {
448 let mut ser = Serializer::new(&mut buffer);
449 let node = Node::Boolean(true);
450 node.serialize(&mut ser).unwrap();
451 }
452
453 let got = String::from_utf8(buffer).unwrap();
454 assert_eq!(got, should_be);
455 }
456
457 #[test]
458 #[ignore]
459 fn serialize_a_list() {
460 let inputs = vec![1, 2, 3, 4];
461
462 let mut buffer = Vec::new();
463
464 {
465 let mut ser = Serializer::new(&mut buffer);
466 inputs.serialize(&mut ser).unwrap();
467 }
468
469 let got = String::from_utf8(buffer).unwrap();
470 println!("{}", got);
471 panic!();
472 }
473
474 #[test]
475 fn unit() {
476 #[derive(Serialize)]
477 struct Unit;
478
479 let data = Unit;
480 let should_be = "<root/>";
481 let mut buffer = Vec::new();
482
483 {
484 let mut ser = Serializer::with_root(Writer::new(&mut buffer), Some("root"));
485 data.serialize(&mut ser).unwrap();
486 }
487
488 let got = String::from_utf8(buffer).unwrap();
489 assert_eq!(got, should_be);
490 }
491
492 #[test]
493 fn newtype() {
494 #[derive(Serialize)]
495 struct Newtype(bool);
496
497 let data = Newtype(true);
498 let should_be = "<root>true</root>";
499 let mut buffer = Vec::new();
500
501 {
502 let mut ser = Serializer::with_root(Writer::new(&mut buffer), Some("root"));
503 data.serialize(&mut ser).unwrap();
504 }
505
506 let got = String::from_utf8(buffer).unwrap();
507 assert_eq!(got, should_be);
508 }
509
510 #[test]
511 fn tuple() {
512 let data = (42.0, "answer");
513 let should_be = "<root>42</root><root>answer</root>";
514 let mut buffer = Vec::new();
515
516 {
517 let mut ser =
518 Serializer::with_root(Writer::new_with_indent(&mut buffer, b' ', 4), Some("root"));
519 data.serialize(&mut ser).unwrap();
520 }
521
522 let got = String::from_utf8(buffer).unwrap();
523 assert_eq!(got, should_be);
524 }
525
526 #[test]
527 fn tuple_struct() {
528 #[derive(Serialize)]
529 struct Tuple(f32, &'static str);
530
531 let data = Tuple(42.0, "answer");
532 let should_be = "<root>42</root><root>answer</root>";
533 let mut buffer = Vec::new();
534
535 {
536 let mut ser =
537 Serializer::with_root(Writer::new_with_indent(&mut buffer, b' ', 4), Some("root"));
538 data.serialize(&mut ser).unwrap();
539 }
540
541 let got = String::from_utf8(buffer).unwrap();
542 assert_eq!(got, should_be);
543 }
544
545 #[test]
546 fn struct_() {
547 #[derive(Serialize)]
548 struct Struct {
549 float: f64,
550 string: String,
551 }
552
553 let mut buffer = Vec::new();
554 let should_be = r#"<root float="42" string="answer"/>"#;
555
556 {
557 let mut ser =
558 Serializer::with_root(Writer::new_with_indent(&mut buffer, b' ', 4), Some("root"));
559 let node = Struct {
560 float: 42.0,
561 string: "answer".to_string(),
562 };
563 node.serialize(&mut ser).unwrap();
564 }
565
566 let got = String::from_utf8(buffer).unwrap();
567 assert_eq!(got, should_be);
568 }
569
570 #[test]
571 fn nested_struct() {
572 #[derive(Serialize)]
573 struct Struct {
574 nested: Nested,
575 string: String,
576 }
577
578 #[derive(Serialize)]
579 struct Nested {
580 float: f64,
581 }
582
583 let mut buffer = Vec::new();
584 let should_be = r#"<root string="answer"><nested float="42"/>
585</root>"#;
586
587 {
588 let mut ser =
589 Serializer::with_root(Writer::new_with_indent(&mut buffer, b' ', 4), Some("root"));
590 let node = Struct {
591 nested: Nested { float: 42.0 },
592 string: "answer".to_string(),
593 };
594 node.serialize(&mut ser).unwrap();
595 }
596
597 let got = String::from_utf8(buffer).unwrap();
598 assert_eq!(got, should_be);
599 }
600
601 #[test]
602 fn flatten_struct() {
603 #[derive(Serialize)]
604 struct Struct {
605 #[serde(flatten)]
606 nested: Nested,
607 string: String,
608 }
609
610 #[derive(Serialize)]
611 struct Nested {
612 float: f64,
613 }
614
615 let mut buffer = Vec::new();
616 let should_be = r#"<root><float>42</float><string>answer</string></root>"#;
617
618 {
619 let mut ser =
620 Serializer::with_root(Writer::new_with_indent(&mut buffer, b' ', 4), Some("root"));
621 let node = Struct {
622 nested: Nested { float: 42.0 },
623 string: "answer".to_string(),
624 };
625 node.serialize(&mut ser).unwrap();
626 }
627
628 let got = String::from_utf8(buffer).unwrap();
629 assert_eq!(got, should_be);
630 }
631
632 mod enum_ {
633 use super::*;
634
635 #[derive(Serialize)]
636 struct Nested {
637 float: f64,
638 }
639
640 mod externally_tagged {
641 use super::*;
642 use pretty_assertions::assert_eq;
643
644 #[derive(Serialize)]
645 enum Node {
646 Unit,
647 #[serde(rename = "$primitive=PrimitiveUnit")]
648 PrimitiveUnit,
649 Newtype(bool),
650 Tuple(f64, String),
651 Struct {
652 float: f64,
653 string: String,
654 },
655 Holder {
656 nested: Nested,
657 string: String,
658 },
659 Flatten {
660 #[serde(flatten)]
661 nested: Nested,
662 string: String,
663 },
664 }
665
666 #[test]
667 fn unit() {
668 let mut buffer = Vec::new();
669 let should_be = "<Unit/>";
670
671 {
672 let mut ser = Serializer::with_root(Writer::new(&mut buffer), Some("root"));
673 let node = Node::Unit;
674 node.serialize(&mut ser).unwrap();
675 }
676
677 let got = String::from_utf8(buffer).unwrap();
678 assert_eq!(got, should_be);
679 }
680
681 #[test]
682 fn primitive_unit() {
683 let mut buffer = Vec::new();
684 let should_be = "PrimitiveUnit";
685
686 {
687 let mut ser = Serializer::with_root(Writer::new(&mut buffer), Some("root"));
688 let node = Node::PrimitiveUnit;
689 node.serialize(&mut ser).unwrap();
690 }
691
692 let got = String::from_utf8(buffer).unwrap();
693 assert_eq!(got, should_be);
694 }
695
696 #[test]
697 fn newtype() {
698 let mut buffer = Vec::new();
699 let should_be = "<Newtype>true</Newtype>";
700
701 {
702 let mut ser = Serializer::with_root(Writer::new(&mut buffer), Some("root"));
703 let node = Node::Newtype(true);
704 node.serialize(&mut ser).unwrap();
705 }
706
707 let got = String::from_utf8(buffer).unwrap();
708 assert_eq!(got, should_be);
709 }
710
711 #[test]
712 fn struct_() {
713 let mut buffer = Vec::new();
714 let should_be = r#"<Struct float="42" string="answer"/>"#;
715
716 {
717 let mut ser = Serializer::with_root(
718 Writer::new_with_indent(&mut buffer, b' ', 4),
719 Some("root"),
720 );
721 let node = Node::Struct {
722 float: 42.0,
723 string: "answer".to_string(),
724 };
725 node.serialize(&mut ser).unwrap();
726 }
727
728 let got = String::from_utf8(buffer).unwrap();
729 assert_eq!(got, should_be);
730 }
731
732 #[test]
733 fn tuple_struct() {
734 let mut buffer = Vec::new();
735 let should_be = "<Tuple>42</Tuple><Tuple>answer</Tuple>";
736
737 {
738 let mut ser = Serializer::with_root(
739 Writer::new_with_indent(&mut buffer, b' ', 4),
740 Some("root"),
741 );
742 let node = Node::Tuple(42.0, "answer".to_string());
743 node.serialize(&mut ser).unwrap();
744 }
745
746 let got = String::from_utf8(buffer).unwrap();
747 assert_eq!(got, should_be);
748 }
749
750 #[test]
751 fn nested_struct() {
752 let mut buffer = Vec::new();
753 let should_be = r#"<Holder string="answer"><nested float="42"/>
754</Holder>"#;
755
756 {
757 let mut ser = Serializer::with_root(
758 Writer::new_with_indent(&mut buffer, b' ', 4),
759 Some("root"),
760 );
761 let node = Node::Holder {
762 nested: Nested { float: 42.0 },
763 string: "answer".to_string(),
764 };
765 node.serialize(&mut ser).unwrap();
766 }
767
768 let got = String::from_utf8(buffer).unwrap();
769 assert_eq!(got, should_be);
770 }
771
772 #[test]
773 fn flatten_struct() {
774 let mut buffer = Vec::new();
775 let should_be = r#"<Flatten><float>42</float><string>answer</string></Flatten>"#;
776
777 {
778 let mut ser = Serializer::with_root(
779 Writer::new_with_indent(&mut buffer, b' ', 4),
780 Some("root"),
781 );
782 let node = Node::Flatten {
783 nested: Nested { float: 42.0 },
784 string: "answer".to_string(),
785 };
786 node.serialize(&mut ser).unwrap();
787 }
788
789 let got = String::from_utf8(buffer).unwrap();
790 assert_eq!(got, should_be);
791 }
792 }
793
794 mod internally_tagged {
795 use super::*;
796 use pretty_assertions::assert_eq;
797
798 #[derive(Serialize)]
799 #[serde(tag = "tag")]
800 enum Node {
801 Unit,
802 Newtype(NewtypeContent),
804 Struct {
806 float: f64,
807 string: String,
808 },
809 Holder {
810 nested: Nested,
811 string: String,
812 },
813 Flatten {
814 #[serde(flatten)]
815 nested: Nested,
816 string: String,
817 },
818 }
819
820 #[derive(Serialize)]
821 struct NewtypeContent {
822 value: bool,
823 }
824
825 #[test]
826 fn unit() {
827 let mut buffer = Vec::new();
828 let should_be = r#"<root tag="Unit"/>"#;
829
830 {
831 let mut ser = Serializer::with_root(Writer::new(&mut buffer), Some("root"));
832 let node = Node::Unit;
833 node.serialize(&mut ser).unwrap();
834 }
835
836 let got = String::from_utf8(buffer).unwrap();
837 assert_eq!(got, should_be);
838 }
839
840 #[test]
841 fn newtype() {
842 let mut buffer = Vec::new();
843 let should_be = r#"<root tag="Newtype" value="true"/>"#;
844
845 {
846 let mut ser = Serializer::with_root(Writer::new(&mut buffer), Some("root"));
847 let node = Node::Newtype(NewtypeContent { value: true });
848 node.serialize(&mut ser).unwrap();
849 }
850
851 let got = String::from_utf8(buffer).unwrap();
852 assert_eq!(got, should_be);
853 }
854
855 #[test]
856 fn struct_() {
857 let mut buffer = Vec::new();
858 let should_be = r#"<root tag="Struct" float="42" string="answer"/>"#;
859
860 {
861 let mut ser = Serializer::with_root(
862 Writer::new_with_indent(&mut buffer, b' ', 4),
863 Some("root"),
864 );
865 let node = Node::Struct {
866 float: 42.0,
867 string: "answer".to_string(),
868 };
869 node.serialize(&mut ser).unwrap();
870 }
871
872 let got = String::from_utf8(buffer).unwrap();
873 assert_eq!(got, should_be);
874 }
875
876 #[test]
877 fn nested_struct() {
878 let mut buffer = Vec::new();
879 let should_be = r#"<root tag="Holder" string="answer"><nested float="42"/>
880</root>"#;
881
882 {
883 let mut ser = Serializer::with_root(
884 Writer::new_with_indent(&mut buffer, b' ', 4),
885 Some("root"),
886 );
887 let node = Node::Holder {
888 nested: Nested { float: 42.0 },
889 string: "answer".to_string(),
890 };
891 node.serialize(&mut ser).unwrap();
892 }
893
894 let got = String::from_utf8(buffer).unwrap();
895 assert_eq!(got, should_be);
896 }
897
898 #[test]
899 fn flatten_struct() {
900 let mut buffer = Vec::new();
901 let should_be =
902 r#"<root><tag>Flatten</tag><float>42</float><string>answer</string></root>"#;
903
904 {
905 let mut ser = Serializer::with_root(
906 Writer::new_with_indent(&mut buffer, b' ', 4),
907 Some("root"),
908 );
909 let node = Node::Flatten {
910 nested: Nested { float: 42.0 },
911 string: "answer".to_string(),
912 };
913 node.serialize(&mut ser).unwrap();
914 }
915
916 let got = String::from_utf8(buffer).unwrap();
917 assert_eq!(got, should_be);
918 }
919 }
920
921 mod adjacently_tagged {
922 use super::*;
923 use pretty_assertions::assert_eq;
924
925 #[derive(Serialize)]
926 #[serde(tag = "tag", content = "content")]
927 enum Node {
928 Unit,
929 Newtype(bool),
930 Tuple(f64, String),
931 Struct {
932 float: f64,
933 string: String,
934 },
935 Holder {
936 nested: Nested,
937 string: String,
938 },
939 Flatten {
940 #[serde(flatten)]
941 nested: Nested,
942 string: String,
943 },
944 }
945
946 #[test]
947 fn unit() {
948 let mut buffer = Vec::new();
949 let should_be = r#"<root tag="Unit"/>"#;
950
951 {
952 let mut ser = Serializer::with_root(Writer::new(&mut buffer), Some("root"));
953 let node = Node::Unit;
954 node.serialize(&mut ser).unwrap();
955 }
956
957 let got = String::from_utf8(buffer).unwrap();
958 assert_eq!(got, should_be);
959 }
960
961 #[test]
962 fn newtype() {
963 let mut buffer = Vec::new();
964 let should_be = r#"<root tag="Newtype" content="true"/>"#;
965
966 {
967 let mut ser = Serializer::with_root(Writer::new(&mut buffer), Some("root"));
968 let node = Node::Newtype(true);
969 node.serialize(&mut ser).unwrap();
970 }
971
972 let got = String::from_utf8(buffer).unwrap();
973 assert_eq!(got, should_be);
974 }
975
976 #[test]
977 fn tuple_struct() {
978 let mut buffer = Vec::new();
979 let should_be = r#"<root tag="Tuple"><content>42</content><content>answer</content>
980</root>"#;
981
982 {
983 let mut ser = Serializer::with_root(
984 Writer::new_with_indent(&mut buffer, b' ', 4),
985 Some("root"),
986 );
987 let node = Node::Tuple(42.0, "answer".to_string());
988 node.serialize(&mut ser).unwrap();
989 }
990
991 let got = String::from_utf8(buffer).unwrap();
992 assert_eq!(got, should_be);
993 }
994
995 #[test]
996 fn struct_() {
997 let mut buffer = Vec::new();
998 let should_be = r#"<root tag="Struct"><content float="42" string="answer"/>
999</root>"#;
1000
1001 {
1002 let mut ser = Serializer::with_root(
1003 Writer::new_with_indent(&mut buffer, b' ', 4),
1004 Some("root"),
1005 );
1006 let node = Node::Struct {
1007 float: 42.0,
1008 string: "answer".to_string(),
1009 };
1010 node.serialize(&mut ser).unwrap();
1011 }
1012
1013 let got = String::from_utf8(buffer).unwrap();
1014 assert_eq!(got, should_be);
1015 }
1016
1017 #[test]
1018 fn nested_struct() {
1019 let mut buffer = Vec::new();
1020 let should_be = r#"<root tag="Holder"><content string="answer"><nested float="42"/></content>
1021</root>"#;
1022
1023 {
1024 let mut ser = Serializer::with_root(
1025 Writer::new_with_indent(&mut buffer, b' ', 4),
1026 Some("root"),
1027 );
1028 let node = Node::Holder {
1029 nested: Nested { float: 42.0 },
1030 string: "answer".to_string(),
1031 };
1032 node.serialize(&mut ser).unwrap();
1033 }
1034
1035 let got = String::from_utf8(buffer).unwrap();
1036 assert_eq!(got, should_be);
1037 }
1038
1039 #[test]
1040 fn flatten_struct() {
1041 let mut buffer = Vec::new();
1042 let should_be = r#"<root tag="Flatten"><content><float>42</float><string>answer</string></content>
1043</root>"#;
1044
1045 {
1046 let mut ser = Serializer::with_root(
1047 Writer::new_with_indent(&mut buffer, b' ', 4),
1048 Some("root"),
1049 );
1050 let node = Node::Flatten {
1051 nested: Nested { float: 42.0 },
1052 string: "answer".to_string(),
1053 };
1054 node.serialize(&mut ser).unwrap();
1055 }
1056
1057 let got = String::from_utf8(buffer).unwrap();
1058 assert_eq!(got, should_be);
1059 }
1060 }
1061
1062 mod untagged {
1063 use super::*;
1064 use pretty_assertions::assert_eq;
1065
1066 #[derive(Serialize)]
1067 #[serde(untagged)]
1068 enum Node {
1069 Unit,
1070 Newtype(bool),
1071 Tuple(f64, String),
1072 Struct {
1073 float: f64,
1074 string: String,
1075 },
1076 Holder {
1077 nested: Nested,
1078 string: String,
1079 },
1080 Flatten {
1081 #[serde(flatten)]
1082 nested: Nested,
1083 string: String,
1084 },
1085 }
1086
1087 #[test]
1088 fn unit() {
1089 let mut buffer = Vec::new();
1090 let should_be = "";
1093
1094 {
1095 let mut ser = Serializer::with_root(Writer::new(&mut buffer), Some("root"));
1096 let node = Node::Unit;
1097 node.serialize(&mut ser).unwrap();
1098 }
1099
1100 let got = String::from_utf8(buffer).unwrap();
1101 assert_eq!(got, should_be);
1102 }
1103
1104 #[test]
1105 fn newtype() {
1106 let mut buffer = Vec::new();
1107 let should_be = "true";
1108
1109 {
1110 let mut ser = Serializer::with_root(Writer::new(&mut buffer), Some("root"));
1111 let node = Node::Newtype(true);
1112 node.serialize(&mut ser).unwrap();
1113 }
1114
1115 let got = String::from_utf8(buffer).unwrap();
1116 assert_eq!(got, should_be);
1117 }
1118
1119 #[test]
1120 fn tuple_struct() {
1121 let mut buffer = Vec::new();
1122 let should_be = "<root>42</root><root>answer</root>";
1123
1124 {
1125 let mut ser = Serializer::with_root(
1126 Writer::new_with_indent(&mut buffer, b' ', 4),
1127 Some("root"),
1128 );
1129 let node = Node::Tuple(42.0, "answer".to_string());
1130 node.serialize(&mut ser).unwrap();
1131 }
1132
1133 let got = String::from_utf8(buffer).unwrap();
1134 assert_eq!(got, should_be);
1135 }
1136
1137 #[test]
1138 fn struct_() {
1139 let mut buffer = Vec::new();
1140 let should_be = r#"<root float="42" string="answer"/>"#;
1141
1142 {
1143 let mut ser = Serializer::with_root(
1144 Writer::new_with_indent(&mut buffer, b' ', 4),
1145 Some("root"),
1146 );
1147 let node = Node::Struct {
1148 float: 42.0,
1149 string: "answer".to_string(),
1150 };
1151 node.serialize(&mut ser).unwrap();
1152 }
1153
1154 let got = String::from_utf8(buffer).unwrap();
1155 assert_eq!(got, should_be);
1156 }
1157
1158 #[test]
1159 fn nested_struct() {
1160 let mut buffer = Vec::new();
1161 let should_be = r#"<root string="answer"><nested float="42"/>
1162</root>"#;
1163
1164 {
1165 let mut ser = Serializer::with_root(
1166 Writer::new_with_indent(&mut buffer, b' ', 4),
1167 Some("root"),
1168 );
1169 let node = Node::Holder {
1170 nested: Nested { float: 42.0 },
1171 string: "answer".to_string(),
1172 };
1173 node.serialize(&mut ser).unwrap();
1174 }
1175
1176 let got = String::from_utf8(buffer).unwrap();
1177 assert_eq!(got, should_be);
1178 }
1179
1180 #[test]
1181 fn flatten_struct() {
1182 let mut buffer = Vec::new();
1183 let should_be = r#"<root><float>42</float><string>answer</string></root>"#;
1184
1185 {
1186 let mut ser = Serializer::with_root(
1187 Writer::new_with_indent(&mut buffer, b' ', 4),
1188 Some("root"),
1189 );
1190 let node = Node::Flatten {
1191 nested: Nested { float: 42.0 },
1192 string: "answer".to_string(),
1193 };
1194 node.serialize(&mut ser).unwrap();
1195 }
1196
1197 let got = String::from_utf8(buffer).unwrap();
1198 assert_eq!(got, should_be);
1199 }
1200 }
1201 }
1202}