use std::io::Write;
use errors::Result;
use events::Event;
#[derive(Clone)]
pub struct Writer<W: Write> {
writer: W,
}
impl<W: Write> Writer<W> {
pub fn new(inner: W) -> Writer<W> {
Writer { writer: inner }
}
pub fn into_inner(self) -> W {
self.writer
}
pub fn write_event<'a, E: AsRef<Event<'a>>>(&mut self, event: E) -> Result<usize> {
match *event.as_ref() {
Event::Start(ref e) => self.write_wrapped(b"<", e, b">"),
Event::End(ref e) => self.write_wrapped(b"</", e, b">"),
Event::Empty(ref e) => self.write_wrapped(b"<", e, b"/>"),
Event::Text(ref e) => self.write(&e.escaped()),
Event::Comment(ref e) => self.write_wrapped(b"<!--", e, b"-->"),
Event::CData(ref e) => self.write_wrapped(b"<![CDATA[", e, b"]]>"),
Event::Decl(ref e) => self.write_wrapped(b"<?", e, b"?>"),
Event::PI(ref e) => self.write_wrapped(b"<?", e, b"?>"),
Event::DocType(ref e) => self.write_wrapped(b"<!DOCTYPE", e, b">"),
Event::Eof => Ok(0),
}
}
#[inline]
pub fn write(&mut self, value: &[u8]) -> Result<usize> {
self.writer.write(value).map_err(|e| e.into())
}
#[inline]
fn write_wrapped(&mut self, before: &[u8], value: &[u8], after: &[u8]) -> Result<usize> {
Ok(
self.writer.write(before)? + self.writer.write(value)? + self.writer.write(after)?,
)
}
}