use std::io::Write;
use crate::{Result, XMLElement, XMLVersion};
pub struct XML {
version: XMLVersion,
encoding: Option<String>,
standalone: Option<bool>,
sort_attributes: bool,
indent: bool,
break_lines: bool,
expand_empty_tags: bool,
root: Option<XMLElement>,
}
impl XML {
pub(crate) const fn new(
version: XMLVersion,
encoding: Option<String>,
standalone: Option<bool>,
indent: bool,
sort_attributes: bool,
break_lines: bool,
expand_empty_tags: bool,
) -> Self {
Self {
version,
encoding,
standalone,
indent,
sort_attributes,
break_lines,
expand_empty_tags,
root: None,
}
}
pub fn set_root_element(&mut self, element: XMLElement) {
self.root = Some(element);
}
pub fn generate<W: Write>(self, mut writer: W) -> Result<()> {
write!(
writer,
r#"<?xml version="{}"{encoding}{standalone}?>"#,
self.version,
encoding = self
.encoding
.map_or_else(String::default, |encoding| format!(
" encoding=\"{encoding}\""
)),
standalone = if let Some(standalone) = self.standalone
&& standalone
{
" standalone=\"yes\"".to_string()
} else {
String::default()
}
)?;
if self.break_lines {
writeln!(writer)?;
}
if let Some(elem) = &self.root {
elem.render(
&mut writer,
self.sort_attributes,
self.indent,
self.break_lines,
self.expand_empty_tags,
)?;
}
Ok(())
}
}