use std::convert::AsRef;
use std::fs::File;
use std::io::{BufRead, BufReader, BufWriter, Cursor, Write};
use std::path::Path;
use util::ResultType;
pub trait Xml: Sized {
#[inline(always)]
fn estimate_xml_size(&self) -> usize {
0
}
fn to_xml<T: Write>(&self, writer: &mut T) -> ResultType<()>;
fn to_xml_string(&self) -> ResultType<String> {
let capacity = self.estimate_xml_size();
let mut writer = Cursor::new(Vec::with_capacity(capacity));
self.to_xml(&mut writer)?;
match String::from_utf8(writer.into_inner()) {
Err(e) => Err(Box::new(e)),
Ok(v) => Ok(v),
}
}
#[inline]
fn to_xml_file<P: AsRef<Path>>(&self, path: P) -> ResultType<()> {
let file = File::create(path)?;
let mut writer = BufWriter::new(file);
self.to_xml(&mut writer)
}
fn from_xml<T: BufRead>(reader: &mut T) -> ResultType<Self>;
#[inline]
fn from_xml_string(text: &str) -> ResultType<Self> {
let mut reader = Cursor::new(text);
Self::from_xml(&mut reader)
}
#[inline]
fn from_xml_file<P: AsRef<Path>>(path: P) -> ResultType<Self> {
let file = File::open(path)?;
let mut reader = BufReader::new(file);
Self::from_xml(&mut reader)
}
}
pub trait XmlCollection: Xml {
fn to_xml_strict<T: Write>(&self, writer: &mut T) -> ResultType<()>;
fn to_xml_lenient<T: Write>(&self, writer: &mut T) -> ResultType<()>;
fn from_xml_strict<T: BufRead>(reader: &mut T) -> ResultType<Self>;
fn from_xml_lenient<T: BufRead>(reader: &mut T) -> ResultType<Self>;
}