use std::fmt::Write as FmtWrite;
#[derive(Debug, Default, Clone)]
pub struct XmlWriter {
pub buf: String,
}
impl XmlWriter {
pub fn new() -> Self {
XmlWriter::default()
}
pub fn with_decl() -> Self {
let mut w = XmlWriter::new();
w.decl();
w
}
pub fn decl(&mut self) {
self.buf
.push_str("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n");
}
pub fn open(&mut self, name: &str) {
self.buf.push('<');
self.buf.push_str(name);
self.buf.push('>');
}
pub fn open_with(&mut self, name: &str, attrs: &[(&str, &str)]) {
self.buf.push('<');
self.buf.push_str(name);
for (k, v) in attrs {
self.buf.push(' ');
self.buf.push_str(k);
self.buf.push_str("=\"");
self.buf.push_str(&super::parser::escape(v));
self.buf.push('"');
}
self.buf.push('>');
}
pub fn empty(&mut self, name: &str) {
self.buf.push('<');
self.buf.push_str(name);
self.buf.push_str("/>");
}
pub fn empty_with(&mut self, name: &str, attrs: &[(&str, &str)]) {
self.buf.push('<');
self.buf.push_str(name);
for (k, v) in attrs {
self.buf.push(' ');
self.buf.push_str(k);
self.buf.push_str("=\"");
self.buf.push_str(&super::parser::escape(v));
self.buf.push('"');
}
self.buf.push_str("/>");
}
pub fn close(&mut self, name: &str) {
self.buf.push_str("</");
self.buf.push_str(name);
self.buf.push('>');
}
pub fn text(&mut self, t: &str) {
self.buf.push_str(&super::parser::escape(t));
}
pub fn raw(&mut self, s: &str) {
self.buf.push_str(s);
}
pub fn leaf(&mut self, name: &str, value: &str) {
self.open(name);
self.text(value);
self.close(name);
}
pub fn leaf_empty(&mut self, name: &str) {
self.empty(name);
}
pub fn leaf_with(&mut self, name: &str, attrs: &[(&str, &str)]) {
self.empty_with(name, attrs);
}
pub fn into_string(self) -> String {
self.buf
}
pub fn as_str(&self) -> &str {
&self.buf
}
}
impl FmtWrite for XmlWriter {
fn write_str(&mut self, s: &str) -> std::fmt::Result {
self.buf.push_str(s);
Ok(())
}
}