use std::io::Write;
#[doc(hidden)]
pub use xml::writer::{EventWriter, Result, XmlEvent};
#[doc(hidden)]
pub use xml::EmitterConfig;
#[doc(hidden)]
pub trait XmlEventWriter {
fn write(&mut self, event: XmlEvent) -> Result<()>;
}
impl<W: Write> XmlEventWriter for EventWriter<W> {
fn write(&mut self, event: XmlEvent) -> Result<()> {
self.write(event)
}
}
#[doc(hidden)]
pub trait XmlWrite<W: XmlEventWriter> {
fn write_xml(&self, w: &mut W) -> Result<()>;
}
#[macro_export]
macro_rules! write_xml {
($w:expr, ) => (Ok(()));
($w:expr, [ $b:block ] $($rest:tt)*) => (
$b.and_then(|_| write_xml!($w, $($rest)*))
);
($w:expr, $e:tt) => ({
let v: $crate::xmlhelper::encode::XmlCharactersRef = $e.into();
let event: $crate::xmlhelper::encode::XmlEvent = v.into();
$w.write(event)
});
($w:expr,
$tag_name:ident[$($attr_name:ident=$attr_value:expr),*][
$($inner:tt)*
] $($rest:tt)*
) => ({
let event = $crate::xmlhelper::encode::XmlEvent::start_element(stringify!($tag_name));
$(
let event = event.attr(stringify!($attr_name), $attr_value);
)*
let event: $crate::xmlhelper::encode::XmlEvent = event.into();
$w.write(event)
.and_then(|_| {
write_xml!($w, $($inner)*)
})
.and_then(|_| {
$w.write($crate::xmlhelper::encode::XmlEvent::EndElement { name: None })
})
.and_then(|_| {
write_xml!($w, $($rest)*)
})
});
}
#[doc(hidden)]
pub struct XmlCharactersRef<'a>(&'a str);
impl<'a> From<&'a str> for XmlCharactersRef<'a> {
fn from(v: &str) -> XmlCharactersRef {
XmlCharactersRef(v)
}
}
impl<'a> From<&'a String> for XmlCharactersRef<'a> {
fn from(v: &String) -> XmlCharactersRef {
XmlCharactersRef(v.as_ref())
}
}
impl<'a> From<XmlCharactersRef<'a>> for XmlEvent<'a> {
fn from(v: XmlCharactersRef) -> XmlEvent {
XmlEvent::characters(v.0)
}
}