use std::io::Write;
use quick_xml::events::Event;
use crate::error::Result;
pub struct Writer<W: Write> {
inner: quick_xml::Writer<W>,
}
impl<W: Write> Writer<W> {
pub fn new(inner: W) -> Self {
Self {
inner: quick_xml::Writer::new(inner),
}
}
pub fn write_event<'a, E: Into<Event<'a>>>(&mut self, event: E) -> Result<()> {
self.inner.write_event(event).map_err(Into::into)
}
pub fn into_inner(self) -> W {
self.inner.into_inner()
}
pub fn write_raw(&mut self, xml: &str) -> Result<()> {
self.inner.get_mut().write_all(xml.as_bytes())?;
Ok(())
}
}
#[cfg(test)]
mod tests {
use quick_xml::events::{BytesEnd, BytesStart, BytesText};
use super::*;
#[test]
fn writes_a_simple_element_with_text() {
let mut writer = Writer::new(Vec::new());
writer
.write_event(Event::Start(BytesStart::new("a")))
.unwrap();
writer
.write_event(Event::Text(BytesText::new("hello")))
.unwrap();
writer.write_event(Event::End(BytesEnd::new("a"))).unwrap();
let output = writer.into_inner();
assert_eq!(output, b"<a>hello</a>");
}
#[test]
fn writes_an_element_with_an_attribute() {
let mut writer = Writer::new(Vec::new());
let mut start = BytesStart::new("a");
start.push_attribute(("k", "v"));
writer.write_event(Event::Empty(start)).unwrap();
let output = writer.into_inner();
assert_eq!(output, br#"<a k="v"/>"#);
}
#[test]
fn write_raw_splices_a_pre_formed_fragment_in_between_events() {
let mut writer = Writer::new(Vec::new());
writer
.write_event(Event::Start(BytesStart::new("a")))
.unwrap();
writer.write_raw("<b/><c>text</c>").unwrap();
writer.write_event(Event::End(BytesEnd::new("a"))).unwrap();
let output = writer.into_inner();
assert_eq!(output, b"<a><b/><c>text</c></a>");
}
}