use std::io;
use std::ops::Deref;
use xml::writer::{events::XmlEvent, EventWriter, Result};
pub trait XmlWriterExt {
fn stack(&mut self, name: &str, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<()>;
fn opt_stack<T>(
&mut self,
name: &str,
data: Option<T>,
f: impl FnOnce(&mut Self, T) -> Result<()>,
) -> Result<()>;
fn element(&mut self, name: &str, data: &str) -> Result<()>;
fn opt_element(&mut self, name: &str, data: Option<impl Deref<Target = str>>) -> Result<()>;
fn iter_element<T>(
&mut self,
iter: impl Iterator<Item = T>,
f: impl FnMut(&mut Self, T) -> Result<()>,
) -> Result<()>;
}
impl<W: io::Write> XmlWriterExt for EventWriter<W> {
fn stack(&mut self, name: &str, f: impl FnOnce(&mut Self) -> Result<()>) -> Result<()> {
self.write(XmlEvent::start_element(name))?;
f(self)?;
self.write(XmlEvent::end_element())
}
fn opt_stack<T>(
&mut self,
name: &str,
data: Option<T>,
f: impl FnOnce(&mut Self, T) -> Result<()>,
) -> Result<()> {
if let Some(data) = data {
self.write(XmlEvent::start_element(name))?;
f(self, data)?;
self.write(XmlEvent::end_element())?;
}
Ok(())
}
fn element(&mut self, name: &str, data: &str) -> Result<()> {
self.write(XmlEvent::start_element(name))?;
self.write(XmlEvent::characters(data))?;
self.write(XmlEvent::end_element())
}
fn opt_element(&mut self, name: &str, data: Option<impl Deref<Target = str>>) -> Result<()> {
if let Some(data) = data {
self.write(XmlEvent::start_element(name))?;
self.write(XmlEvent::characters(&*data))?;
self.write(XmlEvent::end_element())?;
}
Ok(())
}
fn iter_element<T>(
&mut self,
iter: impl Iterator<Item = T>,
mut f: impl FnMut(&mut Self, T) -> Result<()>,
) -> Result<()> {
for data in iter {
f(self, data)?;
}
Ok(())
}
}