use quick_xml::{
events::{BytesText, Event},
Writer,
};
use crate::{Error, XmlSerialize, XmlSerializeAttr};
impl XmlSerialize for str {
fn serialize_child_nodes<W>(&self, writer: &mut Writer<W>) -> Result<(), Error>
where
W: std::io::Write,
{
writer.write_event(Event::Text(BytesText::new(self)))?;
Ok(())
}
}
impl XmlSerialize for String {
fn serialize_child_nodes<W>(&self, writer: &mut Writer<W>) -> Result<(), Error>
where
W: std::io::Write,
{
writer.write_event(Event::Text(BytesText::new(self.as_str())))?;
Ok(())
}
}
impl XmlSerialize for &str {
fn serialize_child_nodes<W>(&self, writer: &mut Writer<W>) -> Result<(), Error>
where
W: std::io::Write,
{
writer.write_event(Event::Text(BytesText::new(self)))?;
Ok(())
}
}
impl XmlSerialize for bool {
fn serialize_child_nodes<W>(&self, writer: &mut Writer<W>) -> Result<(), Error>
where
W: std::io::Write,
{
let content = if *self { "true" } else { "false" };
writer.write_event(Event::Text(BytesText::new(content)))?;
Ok(())
}
}
impl<T> XmlSerialize for Option<T>
where
T: XmlSerialize,
{
fn serialize_as_element<W>(&self, writer: &mut Writer<W>, name: &str) -> Result<(), Error>
where
W: std::io::Write,
{
match self {
Some(value) => <T as XmlSerialize>::serialize_as_element(value, writer, name),
None => Ok(()),
}
}
fn serialize_child_nodes<W>(&self, writer: &mut Writer<W>) -> Result<(), Error>
where
W: std::io::Write,
{
match self {
Some(value) => <T as XmlSerialize>::serialize_child_nodes(value, writer),
None => Ok(()),
}
}
}
impl<T> XmlSerialize for Box<T>
where
T: XmlSerialize,
{
fn serialize_as_element<W>(&self, writer: &mut Writer<W>, name: &str) -> Result<(), Error>
where
W: std::io::Write,
{
<T as XmlSerialize>::serialize_as_element(self, writer, name)
}
fn serialize_child_nodes<W>(&self, writer: &mut Writer<W>) -> Result<(), Error>
where
W: std::io::Write,
{
<T as XmlSerialize>::serialize_child_nodes(self, writer)
}
}
impl<T> XmlSerialize for Vec<T>
where
T: XmlSerialize,
{
fn serialize_child_nodes<W>(&self, writer: &mut Writer<W>) -> Result<(), Error>
where
W: std::io::Write,
{
if self.is_empty() {
return Ok(());
}
for value in self {
<T as XmlSerialize>::serialize_child_nodes(value, writer)?;
}
Ok(())
}
}
impl<T> XmlSerialize for &T
where
T: XmlSerialize,
{
fn serialize_child_nodes<W>(&self, writer: &mut Writer<W>) -> Result<(), Error>
where
W: std::io::Write,
{
T::serialize_child_nodes(self, writer)
}
fn serialize_as_element<W>(&self, writer: &mut Writer<W>, name: &str) -> Result<(), Error>
where
W: std::io::Write,
{
T::serialize_as_element(self, writer, name)
}
}
impl XmlSerializeAttr for str {
fn serialize_as_attribute(&self, start_tag: &mut quick_xml::events::BytesStart, name: &str) {
start_tag.push_attribute((name, self));
}
}
impl XmlSerializeAttr for String {
fn serialize_as_attribute(&self, start_tag: &mut quick_xml::events::BytesStart, name: &str) {
start_tag.push_attribute((name, self.as_str()));
}
}
impl XmlSerializeAttr for &str {
fn serialize_as_attribute(&self, start_tag: &mut quick_xml::events::BytesStart, name: &str) {
start_tag.push_attribute((name, *self));
}
}
impl XmlSerializeAttr for bool {
fn serialize_as_attribute(&self, start_tag: &mut quick_xml::events::BytesStart, name: &str) {
let content = if *self { "true" } else { "false" };
start_tag.push_attribute((name, content));
}
}
impl<T> XmlSerializeAttr for Option<T>
where
T: XmlSerializeAttr,
{
fn serialize_as_attribute(&self, start_tag: &mut quick_xml::events::BytesStart, name: &str) {
if let Some(value) = self {
value.serialize_as_attribute(start_tag, name)
}
}
}
impl<T> XmlSerializeAttr for &T
where
T: XmlSerializeAttr,
{
fn serialize_as_attribute(&self, start_tag: &mut quick_xml::events::BytesStart, name: &str) {
T::serialize_as_attribute(self, start_tag, name);
}
}
macro_rules! impl_as_text_for {
($( $ty:ty ),*) => {
$(
impl XmlSerialize for $ty {
fn serialize_child_nodes<W>(&self, writer: &mut Writer<W>) -> Result<(), Error>
where
W: std::io::Write,
{
let string = self.to_string();
writer.write_event(Event::Text(BytesText::new(&string)))?;
Ok(())
}
}
impl XmlSerializeAttr for $ty {
fn serialize_as_attribute(
&self,
start_tag: &mut quick_xml::events::BytesStart,
name: &str,
) {
start_tag.push_attribute((name, self.to_string().as_str()));
}
})*
};
}
impl_as_text_for!(i8, u8, i16, u16, i32, u32, i64, u64, usize);