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 , WriteResult , XmlName } ;
6+ use crate :: se:: { Indent , QuoteLevel , SeError , TextFormat , WriteResult , XmlName } ;
77use serde:: ser:: {
88 Impossible , Serialize , SerializeSeq , SerializeTuple , SerializeTupleStruct , Serializer ,
99} ;
@@ -71,6 +71,8 @@ pub struct ContentSerializer<'w, 'i, W: Write> {
7171 /// If `true`, then current indent will be written before writing the content,
7272 /// but only if content is not empty. This flag is reset after writing indent.
7373 pub write_indent : bool ,
74+ /// Defines how text content should be serialized (as escaped text or CDATA)
75+ pub text_format : TextFormat ,
7476 /// If `true`, then primitive types that serializes to a text content without
7577 /// surrounding tag will be allowed, otherwise the [`SeError::Unsupported`]
7678 /// will be returned.
@@ -88,10 +90,12 @@ impl<'w, 'i, W: Write> ContentSerializer<'w, 'i, W> {
8890 /// Turns this serializer into serializer of a text content
8991 #[ inline]
9092 pub fn into_simple_type_serializer_impl ( self ) -> SimpleTypeSerializer < & ' w mut W > {
91- //TODO: Customization point: choose between CDATA and Text representation
9293 SimpleTypeSerializer {
9394 writer : self . writer ,
94- target : QuoteTarget :: Text ,
95+ target : match self . text_format {
96+ TextFormat :: Text => QuoteTarget :: Text ,
97+ TextFormat :: CData => QuoteTarget :: CData ,
98+ } ,
9599 level : self . level ,
96100 }
97101 }
@@ -119,6 +123,7 @@ impl<'w, 'i, W: Write> ContentSerializer<'w, 'i, W> {
119123 level : self . level ,
120124 indent : self . indent . borrow ( ) ,
121125 write_indent : self . write_indent ,
126+ text_format : self . text_format ,
122127 allow_primitive,
123128 expand_empty_elements : self . expand_empty_elements ,
124129 }
@@ -600,6 +605,7 @@ pub(super) mod tests {
600605 level: QuoteLevel :: Full ,
601606 indent: Indent :: None ,
602607 write_indent: false ,
608+ text_format: TextFormat :: Text ,
603609 allow_primitive: true ,
604610 expand_empty_elements: false ,
605611 } ;
@@ -623,6 +629,7 @@ pub(super) mod tests {
623629 level: QuoteLevel :: Full ,
624630 indent: Indent :: None ,
625631 write_indent: false ,
632+ text_format: TextFormat :: Text ,
626633 allow_primitive: true ,
627634 expand_empty_elements: false ,
628635 } ;
@@ -1070,6 +1077,7 @@ pub(super) mod tests {
10701077 level: QuoteLevel :: Full ,
10711078 indent: Indent :: Owned ( Indentation :: new( b' ' , 2 ) ) ,
10721079 write_indent: false ,
1080+ text_format: TextFormat :: Text ,
10731081 allow_primitive: true ,
10741082 expand_empty_elements: false ,
10751083 } ;
@@ -1093,6 +1101,7 @@ pub(super) mod tests {
10931101 level: QuoteLevel :: Full ,
10941102 indent: Indent :: Owned ( Indentation :: new( b' ' , 2 ) ) ,
10951103 write_indent: false ,
1104+ text_format: TextFormat :: Text ,
10961105 allow_primitive: true ,
10971106 expand_empty_elements: false ,
10981107 } ;
0 commit comments