use crate::xml::{Element, Ns};
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct Meta {
pub title: Option<String>,
pub subject: Option<String>,
pub description: Option<String>,
pub initial_creator: Option<String>,
pub last_editor: Option<String>,
pub created: Option<String>,
pub modified: Option<String>,
pub generator: Option<String>,
pub keywords: Vec<String>,
}
impl Meta {
pub fn read(root: &Element) -> Self {
let mut meta = Self::default();
let Some(body) = root.child(&Ns::Office, "meta") else {
return meta;
};
for element in body.elements() {
let text = element.plain_text();
let slot = match () {
() if element.is(&Ns::Dc, "title") => &mut meta.title,
() if element.is(&Ns::Dc, "subject") => &mut meta.subject,
() if element.is(&Ns::Dc, "description") => &mut meta.description,
() if element.is(&Ns::Meta, "initial-creator") => &mut meta.initial_creator,
() if element.is(&Ns::Dc, "creator") => &mut meta.last_editor,
() if element.is(&Ns::Meta, "creation-date") => &mut meta.created,
() if element.is(&Ns::Dc, "date") => &mut meta.modified,
() if element.is(&Ns::Meta, "generator") => &mut meta.generator,
() if element.is(&Ns::Meta, "keyword") => {
if !text.is_empty() {
meta.keywords.push(text);
}
continue;
}
() => continue,
};
if !text.is_empty() {
*slot = Some(text);
}
}
meta
}
}