hard_xml/
xml_writer.rs

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}