@@ -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_name : 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, Some ( tag_name ) ) ? ;
281
282
282
283
if let Some ( indent) = indent {
283
284
serializer. indent (
@@ -370,39 +371,7 @@ impl<'a, W: Write> ElementWriter<'a, W> {
370
371
. write_event ( Event :: End ( self . start_tag . to_end ( ) ) ) ?;
371
372
Ok ( self . writer )
372
373
}
373
-
374
- /// Serialize an arbitrary value inside the current element
375
- #[ cfg( feature = "serialize" ) ]
376
- pub fn write_serializable_content < T : Serialize > (
377
- self ,
378
- content : & T ,
379
- ) -> std:: result:: Result < & ' a mut Writer < W > , DeError > {
380
- use crate :: se:: Serializer ;
381
-
382
- self . writer
383
- . write_event ( Event :: Start ( self . start_tag . borrow ( ) ) ) ?;
384
- self . writer . write_indent ( ) ?;
385
-
386
- let indent = self . writer . indent . clone ( ) ;
387
- let fmt = & mut ToFmtWrite ( self . writer . get_mut ( ) ) ;
388
- let mut serializer = Serializer :: new ( fmt) ;
389
-
390
- if let Some ( indent) = indent {
391
- serializer. indent (
392
- indent. indent_char as char ,
393
- indent. indent_size ,
394
- indent. current_indent_len ,
395
- ) ;
396
- }
397
-
398
- content. serialize ( serializer) ?;
399
-
400
- self . writer
401
- . write_event ( Event :: End ( self . start_tag . to_end ( ) ) ) ?;
402
- Ok ( self . writer )
403
- }
404
374
}
405
-
406
375
#[ cfg( feature = "serialize" ) ]
407
376
struct ToFmtWrite < T > ( pub T ) ;
408
377
@@ -628,6 +597,71 @@ mod indentation {
628
597
) ;
629
598
}
630
599
600
+ #[ cfg( feature = "serialize" ) ]
601
+ #[ test]
602
+ fn serializable ( ) {
603
+ #[ derive( Serialize ) ]
604
+ struct Foo {
605
+ #[ serde( rename = "@attribute" ) ]
606
+ attribute : & ' static str ,
607
+
608
+ element : Bar ,
609
+ list : Vec < & ' static str > ,
610
+
611
+ #[ serde( rename = "$text" ) ]
612
+ text : & ' static str ,
613
+
614
+ val : String ,
615
+ }
616
+
617
+ #[ derive( Serialize ) ]
618
+ struct Bar {
619
+ baz : usize ,
620
+ bat : usize ,
621
+ }
622
+
623
+ let mut buffer = Vec :: new ( ) ;
624
+ let mut writer = Writer :: new_with_indent ( & mut buffer, b' ' , 4 ) ;
625
+
626
+ let content = Foo {
627
+ attribute : "attribute" ,
628
+ element : Bar { baz : 42 , bat : 43 } ,
629
+ list : vec ! [ "first element" , "second element" ] ,
630
+ text : "text" ,
631
+ val : "foo" . to_owned ( ) ,
632
+ } ;
633
+
634
+ let start = BytesStart :: new ( "paired" )
635
+ . with_attributes ( vec ! [ ( "attr1" , "value1" ) , ( "attr2" , "value2" ) ] . into_iter ( ) ) ;
636
+ let end = start. to_end ( ) ;
637
+
638
+ writer
639
+ . write_event ( Event :: Start ( start. clone ( ) ) )
640
+ . expect ( "write start tag failed" ) ;
641
+ writer
642
+ . write_serializable ( & content, "foo_element" )
643
+ . expect ( "write serializable inner contents failed" ) ;
644
+ writer
645
+ . write_event ( Event :: End ( end) )
646
+ . expect ( "write end tag failed" ) ;
647
+
648
+ assert_eq ! (
649
+ std:: str :: from_utf8( & buffer) . unwrap( ) ,
650
+ r#"<paired attr1="value1" attr2="value2">
651
+ <foo_element attribute="attribute">
652
+ <element>
653
+ <baz>42</baz>
654
+ <bat>43</bat>
655
+ </element>
656
+ <list>first element</list>
657
+ <list>second element</list>
658
+ text
659
+ <val>foo</val>
660
+ </foo_element>
661
+ </paired>"#
662
+ ) ;
663
+ }
664
+
631
665
#[ test]
632
666
fn element_writer_empty ( ) {
633
667
let mut buffer = Vec :: new ( ) ;
@@ -704,110 +738,4 @@ mod indentation {
704
738
</outer>"#
705
739
) ;
706
740
}
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
741
}
0 commit comments