33use crate :: de:: TEXT_KEY ;
44use crate :: se:: element:: { ElementSerializer , Struct , Tuple } ;
55use crate :: se:: simple_type:: { QuoteTarget , SimpleTypeSerializer } ;
6- use crate :: se:: { Indent , QuoteLevel , SeError , TextFormat , WriteResult , XmlName } ;
6+ use crate :: se:: {
7+ EmptyElementHandling , Indent , QuoteLevel , SeError , TextFormat , WriteResult , XmlName ,
8+ } ;
79use serde:: ser:: {
810 Impossible , Serialize , SerializeSeq , SerializeTuple , SerializeTupleStruct , Serializer ,
911} ;
@@ -80,9 +82,8 @@ pub struct ContentSerializer<'w, 'i, W: Write> {
8082 /// as a text that makes it impossible to distinguish between them during
8183 /// deserialization. Instead of ambiguous serialization the error is returned.
8284 pub allow_primitive : bool ,
83- // If `true`, then empty elements will be serialized as `<element></element>`
84- // instead of `<element/>`.
85- pub expand_empty_elements : bool ,
85+ /// Specifies how empty elements are written.
86+ pub empty_element_handling : EmptyElementHandling ,
8687}
8788
8889impl < ' w , ' i , W : Write > ContentSerializer < ' w , ' i , W > {
@@ -124,25 +125,35 @@ impl<'w, 'i, W: Write> ContentSerializer<'w, 'i, W> {
124125 write_indent : self . write_indent ,
125126 text_format : self . text_format ,
126127 allow_primitive,
127- expand_empty_elements : self . expand_empty_elements ,
128+ empty_element_handling : self . empty_element_handling ,
128129 }
129130 }
130131
131132 /// Writes `name` as self-closed tag
132133 #[ inline]
133134 pub ( super ) fn write_empty ( mut self , name : XmlName ) -> Result < WriteResult , SeError > {
134135 self . write_indent ( ) ?;
135- if self . expand_empty_elements {
136- self . writer . write_char ( '<' ) ?;
137- self . writer . write_str ( name. 0 ) ?;
138- self . writer . write_str ( "></" ) ?;
139- self . writer . write_str ( name. 0 ) ?;
140- self . writer . write_char ( '>' ) ?;
141- } else {
142- self . writer . write_str ( "<" ) ?;
143- self . writer . write_str ( name. 0 ) ?;
144- self . writer . write_str ( "/>" ) ?;
136+
137+ match self . empty_element_handling {
138+ EmptyElementHandling :: SelfClosed => {
139+ self . writer . write_char ( '<' ) ?;
140+ self . writer . write_str ( name. 0 ) ?;
141+ self . writer . write_str ( "/>" ) ?;
142+ }
143+ EmptyElementHandling :: SelfClosedWithSpace => {
144+ self . writer . write_char ( '<' ) ?;
145+ self . writer . write_str ( name. 0 ) ?;
146+ self . writer . write_str ( " />" ) ?;
147+ }
148+ EmptyElementHandling :: Expanded => {
149+ self . writer . write_char ( '<' ) ?;
150+ self . writer . write_str ( name. 0 ) ?;
151+ self . writer . write_str ( "></" ) ?;
152+ self . writer . write_str ( name. 0 ) ?;
153+ self . writer . write_char ( '>' ) ?;
154+ }
145155 }
156+
146157 Ok ( WriteResult :: Element )
147158 }
148159
@@ -604,7 +615,7 @@ pub(super) mod tests {
604615 write_indent: false ,
605616 text_format: TextFormat :: Text ,
606617 allow_primitive: true ,
607- expand_empty_elements : false ,
618+ empty_element_handling : EmptyElementHandling :: SelfClosed ,
608619 } ;
609620
610621 let result = $data. serialize( ser) . unwrap( ) ;
@@ -628,7 +639,7 @@ pub(super) mod tests {
628639 write_indent: false ,
629640 text_format: TextFormat :: Text ,
630641 allow_primitive: true ,
631- expand_empty_elements : false ,
642+ empty_element_handling : EmptyElementHandling :: SelfClosed ,
632643 } ;
633644
634645 match $data. serialize( ser) . unwrap_err( ) {
@@ -1070,7 +1081,7 @@ pub(super) mod tests {
10701081 write_indent: false ,
10711082 text_format: TextFormat :: Text ,
10721083 allow_primitive: true ,
1073- expand_empty_elements : false ,
1084+ empty_element_handling : EmptyElementHandling :: SelfClosed ,
10741085 } ;
10751086
10761087 let result = $data. serialize( ser) . unwrap( ) ;
@@ -1094,7 +1105,7 @@ pub(super) mod tests {
10941105 write_indent: false ,
10951106 text_format: TextFormat :: Text ,
10961107 allow_primitive: true ,
1097- expand_empty_elements : false ,
1108+ empty_element_handling : EmptyElementHandling :: SelfClosed ,
10981109 } ;
10991110
11001111 match $data. serialize( ser) . unwrap_err( ) {
0 commit comments