xmlity/value/
serialize.rs

1use 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}