use serde::{Deserialize, Serialize};
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename = "Types")]
pub struct XlsxTypes {
#[serde(rename = "@xmlns", default)]
pub xmlns: Option<String>,
#[serde(rename = "$value", default)]
pub entries: Vec<XlsxContentTypeEntry>,
}
impl XlsxTypes {
pub fn defaults(&self) -> Vec<XlsxDefault> {
self.entries
.iter()
.filter_map(|e| match e {
XlsxContentTypeEntry::Default(d) => Some(d.clone()),
_ => None,
})
.collect()
}
pub fn overrides(&self) -> Vec<XlsxOverride> {
self.entries
.iter()
.filter_map(|e| match e {
XlsxContentTypeEntry::Override(o) => Some(o.clone()),
_ => None,
})
.collect()
}
pub fn entries_mut(&mut self) -> &mut Vec<XlsxContentTypeEntry> {
&mut self.entries
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum XlsxContentTypeEntry {
#[serde(rename = "Default")]
Default(XlsxDefault),
#[serde(rename = "Override")]
Override(XlsxOverride),
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct XlsxOverride {
#[serde(rename = "@PartName")]
pub part_name: String,
#[serde(rename = "@ContentType")]
pub content_type: String,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct XlsxDefault {
#[serde(rename = "@Extension")]
pub extension: String,
#[serde(rename = "@ContentType")]
pub content_type: String,
}
#[cfg(test)]
mod tests {
use super::*;
use quick_xml::de::from_str;
#[test]
fn deserialize_template() {
let s = crate::constants::XML_HEADER.to_string() + crate::templates::TEMPLATE_CONTENT_TYPES;
let ct: XlsxTypes = from_str(&s).unwrap();
assert_eq!(ct.defaults().len(), 2);
assert_eq!(ct.overrides().len(), 6);
}
}