use std::fmt::Write;
use std::fs::{read_to_string, write};
use std::path::Path;
use quick_xml::se::Serializer;
use serde::Serialize;
use serde::de::DeserializeOwned;
#[allow(clippy::module_name_repetitions)]
pub trait FromXml: DeserializeOwned {
fn from_xml_file(filename: impl AsRef<Path>) -> crate::Result<Self> {
<Self as FromXml>::from_xml_string(&read_to_string(filename)?)
}
fn from_xml_string(text: &str) -> crate::Result<Self> {
Ok(quick_xml::de::from_str(text)?)
}
}
#[allow(clippy::module_name_repetitions)]
pub trait ToXml: Serialize {
fn write_xml<W>(&self, writer: W) -> crate::Result<()>
where
W: Write,
{
Ok(quick_xml::se::to_writer(writer, self).map(drop)?)
}
fn to_xml(&self) -> crate::Result<String> {
Ok(quick_xml::se::to_string(self)?)
}
fn to_xml_pretty(&self, indent_char: char, indent_size: usize) -> crate::Result<String> {
let mut buffer = String::new();
let mut serializer = Serializer::new(&mut buffer);
serializer.indent(indent_char, indent_size);
self.serialize(serializer)?;
Ok(buffer)
}
fn write_to_xml_file(&self, filename: impl AsRef<Path>) -> crate::Result<()> {
Ok(write(filename, <Self as ToXml>::to_xml(self)?)?)
}
fn write_to_xml_file_pretty(
&self,
filename: impl AsRef<Path>,
indent_char: char,
indent_size: usize,
) -> crate::Result<()> {
Ok(write(
filename,
<Self as ToXml>::to_xml_pretty(self, indent_char, indent_size)?,
)?)
}
}