Skip to main content

xlsbye_xml/
writer.rs

1use quick_xml::events::{BytesDecl, BytesEnd, BytesStart, BytesText, Event};
2use quick_xml::Writer;
3use std::io::Write;
4
5pub type Result<T> = std::io::Result<T>;
6
7pub struct XmlWriter<W: Write> {
8    inner: Writer<W>,
9}
10
11impl<W: Write> XmlWriter<W> {
12    pub fn new(writer: W) -> Self {
13        Self {
14            inner: Writer::new_with_indent(writer, b' ', 2),
15        }
16    }
17
18    pub fn into_inner(self) -> W {
19        self.inner.into_inner()
20    }
21
22    pub fn writer(&mut self) -> &mut Writer<W> {
23        &mut self.inner
24    }
25
26    pub fn write_xml_declaration(&mut self) -> Result<()> {
27        self.inner
28            .write_event(Event::Decl(BytesDecl::new("1.0", Some("UTF-8"), Some("yes"))))
29    }
30
31    pub fn write_start_element<I, K, V>(&mut self, name: &str, attrs: I) -> Result<()>
32    where
33        I: IntoIterator<Item = (K, V)>,
34        K: AsRef<str>,
35        V: AsRef<str>,
36    {
37        let mut element = BytesStart::new(name);
38        for (key, value) in attrs {
39            element.push_attribute((key.as_ref(), value.as_ref()));
40        }
41        self.inner.write_event(Event::Start(element))
42    }
43
44    pub fn write_empty_element<I, K, V>(&mut self, name: &str, attrs: I) -> Result<()>
45    where
46        I: IntoIterator<Item = (K, V)>,
47        K: AsRef<str>,
48        V: AsRef<str>,
49    {
50        let mut element = BytesStart::new(name);
51        for (key, value) in attrs {
52            element.push_attribute((key.as_ref(), value.as_ref()));
53        }
54        self.inner.write_event(Event::Empty(element))
55    }
56
57    pub fn write_start_element_with_ns<I, N, K1, V1, K2, V2>(
58        &mut self,
59        name: &str,
60        namespaces: N,
61        attrs: I,
62    ) -> Result<()>
63    where
64        I: IntoIterator<Item = (K1, V1)>,
65        N: IntoIterator<Item = (K2, V2)>,
66        K1: AsRef<str>,
67        V1: AsRef<str>,
68        K2: AsRef<str>,
69        V2: AsRef<str>,
70    {
71        let mut element = BytesStart::new(name);
72
73        for (prefix, uri) in namespaces {
74            if prefix.as_ref().is_empty() {
75                element.push_attribute(("xmlns", uri.as_ref()));
76            } else {
77                let key = format!("xmlns:{}", prefix.as_ref());
78                element.push_attribute((key.as_str(), uri.as_ref()));
79            }
80        }
81
82        for (key, value) in attrs {
83            element.push_attribute((key.as_ref(), value.as_ref()));
84        }
85
86        self.inner.write_event(Event::Start(element))
87    }
88
89    pub fn write_end_element(&mut self, name: &str) -> Result<()> {
90        self.inner.write_event(Event::End(BytesEnd::new(name)))
91    }
92
93    pub fn write_text(&mut self, text: &str) -> Result<()> {
94        self.inner.write_event(Event::Text(BytesText::new(text)))
95    }
96
97    pub fn write_text_element<I, K, V>(&mut self, name: &str, attrs: I, text: &str) -> Result<()>
98    where
99        I: IntoIterator<Item = (K, V)>,
100        K: AsRef<str>,
101        V: AsRef<str>,
102    {
103        self.write_start_element(name, attrs)?;
104        self.write_text(text)?;
105        self.write_end_element(name)
106    }
107}