1use std::io::Result;
2use std::io::Write;
3
4use crate::xml_escape::xml_escape;
5
6pub struct XmlWriter<W: Write> {
7 pub inner: W,
8}
9
10impl<W: Write> XmlWriter<W> {
11 pub fn new(inner: W) -> Self {
12 XmlWriter { inner }
13 }
14
15 pub fn into_inner(self) -> W {
16 self.inner
17 }
18
19 pub fn write_element_start(&mut self, tag: &str) -> Result<()> {
20 write!(self.inner, "<{}", tag)
21 }
22
23 pub fn write_attribute(&mut self, key: &str, value: &str) -> Result<()> {
24 write!(self.inner, r#" {}="{}""#, key, xml_escape(value))
25 }
26
27 pub fn write_text(&mut self, content: &str) -> Result<()> {
28 write!(self.inner, "{}", xml_escape(content))
29 }
30
31 pub fn write_cdata_text(&mut self, content: &str) -> Result<()> {
32 write!(self.inner, "<![CDATA[{}]]>", content)
33 }
34
35 pub fn write_element_end_open(&mut self) -> Result<()> {
36 write!(self.inner, ">")
37 }
38
39 pub fn write_flatten_text(&mut self, tag: &str, content: &str, is_cdata: bool) -> Result<()> {
40 self.write_element_start(tag)?;
41 self.write_element_end_open()?;
42 if is_cdata {
43 self.write_cdata_text(content)?;
44 } else {
45 self.write_text(content)?;
46 }
47 self.write_element_end_close(tag)?;
48 Ok(())
49 }
50
51 pub fn write_element_end_close(&mut self, tag: &str) -> Result<()> {
52 write!(self.inner, "</{}>", tag)
53 }
54
55 pub fn write_element_end_empty(&mut self) -> Result<()> {
56 write!(self.inner, "/>")
57 }
58}