use error::Error;
use fromxml::FromXml;
use quick_xml::{Element, Event, XmlReader, XmlWriter};
use quick_xml::error::Error as XmlError;
use toxml::ToXml;
#[derive(Debug, Clone, PartialEq)]
pub struct Guid {
value: String,
is_permalink: bool,
}
impl Guid {
pub fn is_permalink(&self) -> bool {
self.is_permalink
}
pub fn value(&self) -> &str {
self.value.as_str()
}
}
impl Default for Guid {
#[inline]
fn default() -> Self {
Guid {
value: Default::default(),
is_permalink: true,
}
}
}
impl FromXml for Guid {
fn from_xml<R: ::std::io::BufRead>(mut reader: XmlReader<R>,
element: Element)
-> Result<(Self, XmlReader<R>), Error> {
let mut is_permalink = true;
for attr in element.attributes().with_checks(false).unescaped() {
if let Ok(attr) = attr {
if attr.0 == b"isPermaLink" {
is_permalink = &attr.1 as &[u8] != b"false";
break;
}
}
}
let content = element_text!(reader).unwrap_or_default();
Ok((Guid {
value: content,
is_permalink: is_permalink,
},
reader))
}
}
impl ToXml for Guid {
fn to_xml<W: ::std::io::Write>(&self, writer: &mut XmlWriter<W>) -> Result<(), XmlError> {
let element = Element::new(b"guid");
writer
.write(Event::Start({
let mut element = element.clone();
if !self.is_permalink {
element.extend_attributes(::std::iter::once((b"isPermaLink", b"false")));
}
element
}))?;
writer
.write(Event::Text(Element::new(self.value.as_str())))?;
writer.write(Event::End(element))
}
}
#[derive(Debug, Clone, Default)]
pub struct GuidBuilder {
is_permalink: Option<bool>,
value: String,
}
impl GuidBuilder {
pub fn new() -> GuidBuilder {
GuidBuilder::default()
}
pub fn is_permalink(mut self, is_permalink: Option<bool>) -> GuidBuilder {
self.is_permalink = is_permalink;
self
}
pub fn value(mut self, value: &str) -> GuidBuilder {
self.value = value.to_string();
self
}
pub fn finalize(self) -> Result<Guid, Error> {
let is_permalink = match self.is_permalink {
Some(val) => val,
None => true,
};
Ok(Guid {
is_permalink: is_permalink,
value: self.value,
})
}
}