use std::io::Write;
use quick_xml::events::{BytesEnd, BytesStart, Event};
use quick_xml::Error as XmlError;
use quick_xml::Writer;
use crate::toxml::ToXml;
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Default, Clone, PartialEq)]
#[cfg_attr(feature = "builders", derive(Builder))]
#[cfg_attr(
feature = "builders",
builder(
setter(into),
default,
build_fn(name = "build_impl", private, error = "never::Never")
)
)]
pub struct ITunesCategory {
pub text: String,
pub subcategory: Option<Box<ITunesCategory>>,
}
impl ITunesCategory {
pub fn text(&self) -> &str {
self.text.as_str()
}
pub fn set_text<V>(&mut self, text: V)
where
V: Into<String>,
{
self.text = text.into();
}
pub fn subcategory(&self) -> Option<&ITunesCategory> {
self.subcategory.as_deref()
}
pub fn set_subcategory<V>(&mut self, subcategory: V)
where
V: Into<Option<Box<ITunesCategory>>>,
{
self.subcategory = subcategory.into();
}
}
impl ToXml for ITunesCategory {
fn to_xml<W: Write>(&self, writer: &mut Writer<W>) -> Result<(), XmlError> {
let name = "itunes:category";
let mut element = BytesStart::new(name);
element.push_attribute(("text", &*self.text));
writer.write_event(Event::Start(element))?;
if let Some(subcategory) = self.subcategory.as_ref() {
subcategory.to_xml(writer)?;
}
writer.write_event(Event::End(BytesEnd::new(name)))?;
Ok(())
}
}
#[cfg(feature = "builders")]
impl ITunesCategoryBuilder {
pub fn build(&self) -> ITunesCategory {
self.build_impl().unwrap()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
#[cfg(feature = "builders")]
fn test_builder() {
assert_eq!(
ITunesCategoryBuilder::default().text("music").build(),
ITunesCategory {
text: "music".to_string(),
subcategory: None,
}
);
assert_eq!(
ITunesCategoryBuilder::default()
.text("music")
.subcategory(Some(Box::new(
ITunesCategoryBuilder::default().text("pop").build()
)))
.build(),
ITunesCategory {
text: "music".to_string(),
subcategory: Some(Box::new(ITunesCategory {
text: "pop".to_string(),
subcategory: None,
})),
}
);
}
}