xmlity/value/
serialize.rs1use crate::{
2 ser::{
3 SerializeAttributeAccess as _, SerializeAttributes as _, SerializeElement as _,
4 SerializeElementAttributes as _, SerializeSeq as _,
5 },
6 AttributeSerializer, Serialize, SerializeAttribute, Serializer,
7};
8
9use super::*;
10
11impl Serialize for XmlValue {
12 fn serialize<S: crate::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13 match self {
14 XmlValue::Text(xml_text) => xml_text.serialize(serializer),
15 XmlValue::CData(xml_cdata) => xml_cdata.serialize(serializer),
16 XmlValue::Element(xml_element) => xml_element.serialize(serializer),
17 XmlValue::Seq(xml_seq) => xml_seq.serialize(serializer),
18 XmlValue::PI(xml_pi) => xml_pi.serialize(serializer),
19 XmlValue::Decl(xml_decl) => xml_decl.serialize(serializer),
20 XmlValue::Comment(xml_comment) => xml_comment.serialize(serializer),
21 XmlValue::Doctype(xml_doctype) => xml_doctype.serialize(serializer),
22 XmlValue::None => serializer.serialize_none(),
23 }
24 }
25}
26impl Serialize for XmlText {
27 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
28 where
29 S: Serializer,
30 {
31 serializer.serialize_text(String::from_utf8_lossy(&self.0))
32 }
33}
34impl Serialize for XmlCData {
35 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
36 where
37 S: Serializer,
38 {
39 serializer.serialize_cdata(str::from_utf8(&self.0).unwrap())
40 }
41}
42
43impl Serialize for XmlChild {
44 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
45 where
46 S: Serializer,
47 {
48 match self {
49 XmlChild::Text(v) => v.serialize(serializer),
50 XmlChild::CData(v) => v.serialize(serializer),
51 XmlChild::Element(v) => v.serialize(serializer),
52 XmlChild::PI(v) => v.serialize(serializer),
53 XmlChild::Comment(v) => v.serialize(serializer),
54 XmlChild::None => serializer.serialize_none(),
55 }
56 }
57}
58impl Serialize for XmlElement {
59 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
60 where
61 S: Serializer,
62 {
63 let element = serializer.serialize_element(&self.name)?;
64
65 let mut attributes = element.serialize_attributes()?;
66 for attr in &self.attributes {
67 attributes.serialize_attribute(attr)?;
68 }
69
70 if self.children.values.is_empty() {
71 return attributes.end();
72 }
73
74 let mut children = attributes.serialize_children()?;
75 for child in &self.children.values {
76 children.serialize_element(child)?;
77 }
78 children.end()
79 }
80}
81impl<T: Serialize> Serialize for XmlSeq<T> {
82 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
83 where
84 S: crate::ser::Serializer,
85 {
86 let mut seq = serializer.serialize_seq()?;
87 for item in self.values.iter() {
88 seq.serialize_element(item)?;
89 }
90
91 seq.end()
92 }
93}
94
95impl Serialize for XmlProcessingInstruction {
96 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
97 where
98 S: crate::ser::Serializer,
99 {
100 serializer.serialize_pi(&self.target, &self.content)
101 }
102}
103
104impl Serialize for XmlDecl {
105 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
106 serializer.serialize_decl(
107 self.version.deref(),
108 self.encoding.as_deref(),
109 self.standalone.as_deref(),
110 )
111 }
112}
113
114impl Serialize for XmlComment {
115 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
116 where
117 S: Serializer,
118 {
119 serializer.serialize_comment(&self.0)
120 }
121}
122
123impl Serialize for XmlDoctype {
124 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
125 where
126 S: Serializer,
127 {
128 serializer.serialize_doctype(&self.0)
129 }
130}
131
132impl SerializeAttribute for XmlAttribute {
133 fn serialize_attribute<S>(&self, mut serializer: S) -> Result<S::Ok, S::Error>
134 where
135 S: AttributeSerializer,
136 {
137 let attr = serializer.serialize_attribute(&self.name)?;
138
139 attr.end(&self.value)
140 }
141}