@@ -265,6 +265,32 @@ impl<W: Write> Writer<W> {
265
265
start_tag : BytesStart :: new ( name. as_ref ( ) ) ,
266
266
}
267
267
}
268
+
269
+ /// Write an arbitrary serializable object
270
+ #[ cfg( feature = "serialize" ) ]
271
+ pub fn write_serializable < T : Serialize > (
272
+ & mut self ,
273
+ content : & T ,
274
+ ) -> std:: result:: Result < ( ) , DeError > {
275
+ use crate :: se:: Serializer ;
276
+
277
+ self . write_indent ( ) ?;
278
+ let indent = self . indent . clone ( ) ;
279
+ let mut fmt = ToFmtWrite ( self . get_mut ( ) ) ;
280
+ let mut serializer = Serializer :: new ( & mut fmt) ;
281
+
282
+ if let Some ( indent) = indent {
283
+ serializer. indent (
284
+ indent. indent_char as char ,
285
+ indent. indent_size ,
286
+ indent. current_indent_len ,
287
+ ) ;
288
+ }
289
+
290
+ content. serialize ( serializer) ?;
291
+
292
+ Ok ( ( ) )
293
+ }
268
294
}
269
295
270
296
/// A struct to write an element. Contains methods to add attributes and inner
@@ -358,7 +384,8 @@ impl<'a, W: Write> ElementWriter<'a, W> {
358
384
self . writer . write_indent ( ) ?;
359
385
360
386
let indent = self . writer . indent . clone ( ) ;
361
- let mut serializer = Serializer :: new ( ToFmtWrite ( self . writer . inner ( ) ) ) ;
387
+ let fmt = & mut ToFmtWrite ( self . writer . get_mut ( ) ) ;
388
+ let mut serializer = Serializer :: new ( fmt) ;
362
389
363
390
if let Some ( indent) = indent {
364
391
serializer. indent (
@@ -679,11 +706,20 @@ mod indentation {
679
706
}
680
707
681
708
#[ cfg( feature = "serialize" ) ]
682
- #[ test]
683
- fn element_writer_serialize ( ) {
709
+ mod write_serializable {
710
+ use super :: * ;
711
+
684
712
#[ derive( Serialize ) ]
685
713
struct Foo {
686
- bar : Bar ,
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
+
687
723
val : String ,
688
724
}
689
725
@@ -693,31 +729,85 @@ mod indentation {
693
729
bat : usize ,
694
730
}
695
731
696
- let mut buffer = Vec :: new ( ) ;
697
- let mut writer = Writer :: new_with_indent ( & mut buffer, b' ' , 4 ) ;
698
- let content = Foo {
699
- bar : Bar { baz : 42 , bat : 43 } ,
700
- val : "foo" . to_owned ( ) ,
701
- } ;
702
-
703
- writer
704
- . create_element ( "paired" )
705
- . with_attribute ( ( "attr1" , "value1" ) )
706
- . with_attribute ( ( "attr2" , "value2" ) )
707
- . write_serializable_content ( & content)
708
- . expect ( "failure" ) ;
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
+ }
709
776
710
- assert_eq ! (
711
- std:: str :: from_utf8( & buffer) . unwrap( ) ,
712
- r#"<paired attr1="value1" attr2="value2">
713
- <Foo>
714
- <bar>
715
- <baz>42</baz>
716
- <bat>43</bat>
717
- </bar>
718
- <val>foo</val>
719
- </Foo>
720
- </paired>"#
721
- ) ;
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
+ }
722
812
}
723
813
}
0 commit comments