use std::io::Write;
use quick_xml::{
events::{BytesEnd, BytesStart, BytesText, Event},
ElementWriter,
};
use thiserror::Error;
pub struct XmlStreamWriter<T> {
writer: quick_xml::Writer<T>,
}
#[derive(Debug, Error)]
pub enum XmlWriteError {
#[error("{0}")]
Xml(#[from] quick_xml::Error),
#[error("Failed to write to stream: {0}")]
Io(#[from] std::io::Error),
}
impl<T: Write> XmlStreamWriter<T> {
pub fn new(writer: T) -> Self {
Self {
writer: quick_xml::Writer::new(writer),
}
}
pub fn write_event(&mut self, element: Event<'_>) -> Result<(), XmlWriteError> {
self.writer.write_event(element)?;
Ok(())
}
pub fn write_start(&mut self, tag: &str) -> Result<(), XmlWriteError> {
self.writer
.write_event(Event::Start(BytesStart::new(tag)))?;
Ok(())
}
pub fn write_end(&mut self, tag: &str) -> Result<(), XmlWriteError> {
self.writer.write_event(Event::End(BytesEnd::new(tag)))?;
Ok(())
}
pub fn write_empty(&mut self, tag: &str) -> Result<(), XmlWriteError> {
self.writer
.write_event(Event::Empty(BytesStart::new(tag)))?;
Ok(())
}
pub fn write_text(&mut self, text: &str) -> Result<(), XmlWriteError> {
self.writer.write_event(Event::Text(BytesText::new(text)))?;
Ok(())
}
pub fn create_element<'a>(&'a mut self, name: &'a str) -> ElementWriter<'a, T> {
self.writer.create_element(name)
}
}
impl XmlStreamWriter<&mut dyn Write> {
pub fn write_raw(&mut self, data: &[u8]) -> Result<(), XmlWriteError> {
self.writer.get_mut().write_all(data)?;
Ok(())
}
}