@@ -271,13 +271,14 @@ impl<W: Write> Writer<W> {
271
271
pub fn write_serializable < T : Serialize > (
272
272
& mut self ,
273
273
content : & T ,
274
+ tag_override : Option < & str > ,
274
275
) -> std:: result:: Result < ( ) , DeError > {
275
276
use crate :: se:: Serializer ;
276
277
277
278
self . write_indent ( ) ?;
278
279
let indent = self . indent . clone ( ) ;
279
280
let mut fmt = ToFmtWrite ( self . get_mut ( ) ) ;
280
- let mut serializer = Serializer :: new ( & mut fmt) ;
281
+ let mut serializer = Serializer :: with_root ( & mut fmt, tag_override ) ? ;
281
282
282
283
if let Some ( indent) = indent {
283
284
serializer. indent (
@@ -628,6 +629,85 @@ mod indentation {
628
629
) ;
629
630
}
630
631
632
+
633
+ #[ cfg( feature = "serialize" ) ]
634
+ #[ test]
635
+ fn serializable ( ) {
636
+ #[ derive( Serialize ) ]
637
+ struct Foo {
638
+ #[ serde( rename = "@attribute" ) ]
639
+ attribute : & ' static str ,
640
+
641
+ element : Bar ,
642
+ list : Vec < & ' static str > ,
643
+
644
+ #[ serde( rename = "$text" ) ]
645
+ text : & ' static str ,
646
+
647
+ val : String ,
648
+ }
649
+
650
+ #[ derive( Serialize ) ]
651
+ struct Bar {
652
+ baz : usize ,
653
+ bat : usize ,
654
+ }
655
+
656
+ let mut buffer = Vec :: new ( ) ;
657
+ let mut writer = Writer :: new_with_indent ( & mut buffer, b' ' , 4 ) ;
658
+
659
+ let content = Foo {
660
+ attribute : "attribute" ,
661
+ element : Bar { baz : 42 , bat : 43 } ,
662
+ list : vec ! [ "first element" , "second element" ] ,
663
+ text : "text" ,
664
+ val : "foo" . to_owned ( ) ,
665
+ } ;
666
+
667
+ let start = BytesStart :: new ( "paired" )
668
+ . with_attributes ( vec ! [ ( "attr1" , "value1" ) , ( "attr2" , "value2" ) ] . into_iter ( ) ) ;
669
+ let end = start. to_end ( ) ;
670
+
671
+ writer
672
+ . write_event ( Event :: Start ( start. clone ( ) ) )
673
+ . expect ( "write start tag failed" ) ;
674
+ writer
675
+ . write_serializable ( & content, None )
676
+ . expect ( "write serializable inner contents failed" ) ;
677
+ writer
678
+ . write_serializable ( & content, Some ( "customelement" ) )
679
+ . expect ( "write serializable inner contents failed" ) ;
680
+ writer
681
+ . write_event ( Event :: End ( end) )
682
+ . expect ( "write end tag failed" ) ;
683
+
684
+ assert_eq ! (
685
+ std:: str :: from_utf8( & buffer) . unwrap( ) ,
686
+ r#"<paired attr1="value1" attr2="value2">
687
+ <Foo attribute="attribute">
688
+ <element>
689
+ <baz>42</baz>
690
+ <bat>43</bat>
691
+ </element>
692
+ <list>first element</list>
693
+ <list>second element</list>
694
+ text
695
+ <val>foo</val>
696
+ </Foo>
697
+ <customelement attribute="attribute">
698
+ <element>
699
+ <baz>42</baz>
700
+ <bat>43</bat>
701
+ </element>
702
+ <list>first element</list>
703
+ <list>second element</list>
704
+ text
705
+ <val>foo</val>
706
+ </customelement>
707
+ </paired>"#
708
+ ) ;
709
+ }
710
+
631
711
#[ test]
632
712
fn element_writer_empty ( ) {
633
713
let mut buffer = Vec :: new ( ) ;
@@ -704,110 +784,4 @@ mod indentation {
704
784
</outer>"#
705
785
) ;
706
786
}
707
-
708
- #[ cfg( feature = "serialize" ) ]
709
- mod write_serializable {
710
- use super :: * ;
711
-
712
- #[ derive( Serialize ) ]
713
- struct Foo {
714
- #[ serde( rename = "@attribute" ) ]
715
- attribute : & ' static str ,
716
-
717
- element : Bar ,
718
- list : Vec < & ' static str > ,
719
-
720
- #[ serde( rename = "$text" ) ]
721
- text : & ' static str ,
722
-
723
- val : String ,
724
- }
725
-
726
- #[ derive( Serialize ) ]
727
- struct Bar {
728
- baz : usize ,
729
- bat : usize ,
730
- }
731
-
732
- #[ cfg( feature = "serialize" ) ]
733
- #[ test]
734
- fn serializable ( ) {
735
- let mut buffer = Vec :: new ( ) ;
736
- let mut writer = Writer :: new_with_indent ( & mut buffer, b' ' , 4 ) ;
737
-
738
- let content = Foo {
739
- attribute : "attribute" ,
740
- element : Bar { baz : 42 , bat : 43 } ,
741
- list : vec ! [ "first element" , "second element" ] ,
742
- text : "text" ,
743
- val : "foo" . to_owned ( ) ,
744
- } ;
745
-
746
- let start = BytesStart :: new ( "paired" )
747
- . with_attributes ( vec ! [ ( "attr1" , "value1" ) , ( "attr2" , "value2" ) ] . into_iter ( ) ) ;
748
- let end = start. to_end ( ) ;
749
-
750
- writer
751
- . write_event ( Event :: Start ( start. clone ( ) ) )
752
- . expect ( "write start tag failed" ) ;
753
- writer
754
- . write_serializable ( & content)
755
- . expect ( "write serializable inner contents failed" ) ;
756
- writer
757
- . write_event ( Event :: End ( end) )
758
- . expect ( "write end tag failed" ) ;
759
-
760
- assert_eq ! (
761
- std:: str :: from_utf8( & buffer) . unwrap( ) ,
762
- r#"<paired attr1="value1" attr2="value2">
763
- <Foo attribute="attribute">
764
- <element>
765
- <baz>42</baz>
766
- <bat>43</bat>
767
- </element>
768
- <list>first element</list>
769
- <list>second element</list>
770
- text
771
- <val>foo</val>
772
- </Foo>
773
- </paired>"#
774
- ) ;
775
- }
776
-
777
- #[ test]
778
- fn element_writer_serializable ( ) {
779
- let mut buffer = Vec :: new ( ) ;
780
- let mut writer = Writer :: new_with_indent ( & mut buffer, b' ' , 4 ) ;
781
- let content = Foo {
782
- attribute : "attribute" ,
783
- element : Bar { baz : 42 , bat : 43 } ,
784
- list : vec ! [ "first element" , "second element" ] ,
785
- text : "text" ,
786
- val : "foo" . to_string ( ) ,
787
- } ;
788
-
789
- writer
790
- . create_element ( "paired" )
791
- . with_attribute ( ( "attr1" , "value1" ) )
792
- . with_attribute ( ( "attr2" , "value2" ) )
793
- . write_serializable_content ( & content)
794
- . expect ( "failure" ) ;
795
-
796
- assert_eq ! (
797
- std:: str :: from_utf8( & buffer) . unwrap( ) ,
798
- r#"<paired attr1="value1" attr2="value2">
799
- <Foo attribute="attribute">
800
- <element>
801
- <baz>42</baz>
802
- <bat>43</bat>
803
- </element>
804
- <list>first element</list>
805
- <list>second element</list>
806
- text
807
- <val>foo</val>
808
- </Foo>
809
- </paired>"#
810
- ) ;
811
- }
812
- }
813
787
}
0 commit comments