extern crate alloc;
pub use self::config::EmitterConfig;
pub use self::emitter::EmitterError as Error;
pub use self::emitter::Result;
pub use self::events::XmlEvent;
use self::emitter::Emitter;
mod config;
mod emitter;
pub mod events;
pub struct EventWriter {
sink: alloc::string::String,
emitter: Emitter,
}
impl EventWriter {
#[inline]
pub fn new() -> EventWriter {
EventWriter::new_with_config(EmitterConfig::new())
}
#[inline]
pub fn new_with_config(config: EmitterConfig) -> EventWriter {
EventWriter {
sink: alloc::string::String::new(),
emitter: Emitter::new(config),
}
}
pub fn write<'a, E>(&mut self, event: E) -> Result<()> where E: Into<XmlEvent<'a>> {
match event.into() {
XmlEvent::StartDocument { version, encoding, standalone } =>
self.emitter.emit_start_document(&mut self.sink, version, encoding.unwrap_or("UTF-8"), standalone),
XmlEvent::ProcessingInstruction { name, data } =>
self.emitter.emit_processing_instruction(&mut self.sink, name, data),
XmlEvent::StartElement { name, attributes, namespace } => {
self.emitter.namespace_stack_mut().push_empty().checked_target().extend(namespace.as_ref());
self.emitter.emit_start_element(&mut self.sink, name, &attributes)
}
XmlEvent::EndElement { name } => {
let r = self.emitter.emit_end_element(&mut self.sink, name);
self.emitter.namespace_stack_mut().try_pop();
r
}
XmlEvent::Comment(content) => self.emitter.emit_comment(&mut self.sink, content),
XmlEvent::CData(content) => Ok(self.emitter.emit_cdata(&mut self.sink, content)),
XmlEvent::Characters(content) => Ok(self.emitter.emit_characters(&mut self.sink, content)),
}
}
pub fn inner_mut(&mut self) -> &mut alloc::string::String {
&mut self.sink
}
pub fn into_inner(self) -> alloc::string::String {
self.sink
}
}