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}