use std::collections::BTreeMap;
use std::io::Write;
use quick_xml::Error as XmlError;
use quick_xml::Writer;
use crate::extension::util::get_extension_values;
use crate::extension::Extension;
use crate::toxml::{ToXml, WriterExt};
pub const NAMESPACE: &str = "http://purl.org/dc/elements/1.1/";
#[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 DublinCoreExtension {
#[cfg_attr(feature = "builders", builder(setter(each = "contributor")))]
pub contributors: Vec<String>,
#[cfg_attr(feature = "builders", builder(setter(each = "coverage")))]
pub coverages: Vec<String>,
#[cfg_attr(feature = "builders", builder(setter(each = "creator")))]
pub creators: Vec<String>,
#[cfg_attr(feature = "builders", builder(setter(each = "date")))]
pub dates: Vec<String>,
#[cfg_attr(feature = "builders", builder(setter(each = "description")))]
pub descriptions: Vec<String>,
#[cfg_attr(feature = "builders", builder(setter(each = "format")))]
pub formats: Vec<String>,
#[cfg_attr(feature = "builders", builder(setter(each = "identifier")))]
pub identifiers: Vec<String>,
#[cfg_attr(feature = "builders", builder(setter(each = "language")))]
pub languages: Vec<String>,
#[cfg_attr(feature = "builders", builder(setter(each = "publisher")))]
pub publishers: Vec<String>,
#[cfg_attr(feature = "builders", builder(setter(each = "relation")))]
pub relations: Vec<String>,
#[cfg_attr(feature = "builders", builder(setter(each = "right")))]
pub rights: Vec<String>,
#[cfg_attr(feature = "builders", builder(setter(each = "source")))]
pub sources: Vec<String>,
#[cfg_attr(feature = "builders", builder(setter(each = "subject")))]
pub subjects: Vec<String>,
#[cfg_attr(feature = "builders", builder(setter(each = "title")))]
pub titles: Vec<String>,
#[cfg_attr(feature = "builders", builder(setter(each = "r#type")))]
pub types: Vec<String>,
}
impl DublinCoreExtension {
pub fn contributors(&self) -> &[String] {
&self.contributors
}
pub fn contributors_mut(&mut self) -> &mut [String] {
&mut self.contributors
}
pub fn set_contributors<V>(&mut self, contributors: V)
where
V: Into<Vec<String>>,
{
self.contributors = contributors.into();
}
pub fn coverages(&self) -> &[String] {
&self.coverages
}
pub fn coverages_mut(&mut self) -> &mut [String] {
&mut self.coverages
}
pub fn set_coverages<V>(&mut self, coverages: V)
where
V: Into<Vec<String>>,
{
self.coverages = coverages.into();
}
pub fn creators(&self) -> &[String] {
&self.creators
}
pub fn creators_mut(&mut self) -> &mut [String] {
&mut self.creators
}
pub fn set_creators<V>(&mut self, creators: V)
where
V: Into<Vec<String>>,
{
self.creators = creators.into();
}
pub fn dates(&self) -> &[String] {
&self.dates
}
pub fn dates_mut(&mut self) -> &mut [String] {
&mut self.dates
}
pub fn set_dates<V>(&mut self, dates: V)
where
V: Into<Vec<String>>,
{
self.dates = dates.into();
}
pub fn descriptions(&self) -> &[String] {
&self.descriptions
}
pub fn descriptions_mut(&mut self) -> &mut [String] {
&mut self.descriptions
}
pub fn set_descriptions<V>(&mut self, descriptions: V)
where
V: Into<Vec<String>>,
{
self.descriptions = descriptions.into();
}
pub fn formats(&self) -> &[String] {
&self.formats
}
pub fn formats_mut(&mut self) -> &mut [String] {
&mut self.formats
}
pub fn set_formats<V>(&mut self, formats: V)
where
V: Into<Vec<String>>,
{
self.formats = formats.into();
}
pub fn identifiers(&self) -> &[String] {
&self.identifiers
}
pub fn identifiers_mut(&mut self) -> &mut [String] {
&mut self.identifiers
}
pub fn set_identifiers<V>(&mut self, identifiers: V)
where
V: Into<Vec<String>>,
{
self.identifiers = identifiers.into();
}
pub fn languages(&self) -> &[String] {
&self.languages
}
pub fn languages_mut(&mut self) -> &mut [String] {
&mut self.languages
}
pub fn set_languages<V>(&mut self, languages: V)
where
V: Into<Vec<String>>,
{
self.languages = languages.into();
}
pub fn publishers(&self) -> &[String] {
&self.publishers
}
pub fn publishers_mut(&mut self) -> &mut [String] {
&mut self.publishers
}
pub fn set_publishers<V>(&mut self, publishers: V)
where
V: Into<Vec<String>>,
{
self.publishers = publishers.into();
}
pub fn relations(&self) -> &[String] {
&self.relations
}
pub fn relations_mut(&mut self) -> &mut [String] {
&mut self.relations
}
pub fn set_relations<V>(&mut self, relations: V)
where
V: Into<Vec<String>>,
{
self.relations = relations.into();
}
pub fn rights(&self) -> &[String] {
&self.rights
}
pub fn rights_mut(&mut self) -> &mut [String] {
&mut self.rights
}
pub fn set_rights<V>(&mut self, rights: V)
where
V: Into<Vec<String>>,
{
self.rights = rights.into();
}
pub fn sources(&self) -> &[String] {
&self.sources
}
pub fn sources_mut(&mut self) -> &mut [String] {
&mut self.sources
}
pub fn set_sources<V>(&mut self, sources: V)
where
V: Into<Vec<String>>,
{
self.sources = sources.into();
}
pub fn subjects(&self) -> &[String] {
&self.subjects
}
pub fn subjects_mut(&mut self) -> &mut [String] {
&mut self.subjects
}
pub fn set_subjects<V>(&mut self, subjects: V)
where
V: Into<Vec<String>>,
{
self.subjects = subjects.into();
}
pub fn titles(&self) -> &[String] {
&self.titles
}
pub fn titles_mut(&mut self) -> &mut [String] {
&mut self.titles
}
pub fn set_titles<V>(&mut self, titles: V)
where
V: Into<Vec<String>>,
{
self.titles = titles.into();
}
pub fn types(&self) -> &[String] {
&self.types
}
pub fn types_mut(&mut self) -> &mut [String] {
&mut self.types
}
pub fn set_types<V>(&mut self, types: V)
where
V: Into<Vec<String>>,
{
self.types = types.into();
}
}
impl DublinCoreExtension {
pub fn from_map(map: BTreeMap<String, Vec<Extension>>) -> Self {
let mut ext = DublinCoreExtension::default();
for (key, v) in map {
match key.as_str() {
"contributor" => ext.contributors = get_extension_values(v),
"coverage" => ext.coverages = get_extension_values(v),
"creator" => ext.creators = get_extension_values(v),
"date" => ext.dates = get_extension_values(v),
"description" => ext.descriptions = get_extension_values(v),
"format" => ext.formats = get_extension_values(v),
"identifier" => ext.identifiers = get_extension_values(v),
"language" => ext.languages = get_extension_values(v),
"publisher" => ext.publishers = get_extension_values(v),
"relation" => ext.relations = get_extension_values(v),
"rights" => ext.rights = get_extension_values(v),
"source" => ext.sources = get_extension_values(v),
"subject" => ext.subjects = get_extension_values(v),
"title" => ext.titles = get_extension_values(v),
"type" => ext.types = get_extension_values(v),
_ => {}
}
}
ext
}
}
impl ToXml for DublinCoreExtension {
fn to_xml<W: Write>(&self, writer: &mut Writer<W>) -> Result<(), XmlError> {
writer.write_text_elements("dc:contributor", &self.contributors)?;
writer.write_text_elements("dc:coverage", &self.coverages)?;
writer.write_text_elements("dc:creator", &self.creators)?;
writer.write_text_elements("dc:date", &self.dates)?;
writer.write_text_elements("dc:description", &self.descriptions)?;
writer.write_text_elements("dc:format", &self.formats)?;
writer.write_text_elements("dc:identifier", &self.identifiers)?;
writer.write_text_elements("dc:language", &self.languages)?;
writer.write_text_elements("dc:publisher", &self.publishers)?;
writer.write_text_elements("dc:relation", &self.relations)?;
writer.write_text_elements("dc:rights", &self.rights)?;
writer.write_text_elements("dc:source", &self.sources)?;
writer.write_text_elements("dc:subject", &self.subjects)?;
writer.write_text_elements("dc:title", &self.titles)?;
writer.write_text_elements("dc:type", &self.types)?;
Ok(())
}
fn used_namespaces(&self) -> BTreeMap<String, String> {
let mut namespaces = BTreeMap::new();
namespaces.insert("dc".to_owned(), NAMESPACE.to_owned());
namespaces
}
}
#[cfg(feature = "builders")]
impl DublinCoreExtensionBuilder {
pub fn build(&self) -> DublinCoreExtension {
self.build_impl().unwrap()
}
}