excelize_rs/xml/
content_types.rs1use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
13#[serde(rename = "Types")]
14pub struct XlsxTypes {
15 #[serde(rename = "@xmlns", default)]
16 pub xmlns: Option<String>,
17 #[serde(rename = "$value", default)]
19 pub entries: Vec<XlsxContentTypeEntry>,
20}
21
22impl XlsxTypes {
23 pub fn defaults(&self) -> Vec<XlsxDefault> {
25 self.entries
26 .iter()
27 .filter_map(|e| match e {
28 XlsxContentTypeEntry::Default(d) => Some(d.clone()),
29 _ => None,
30 })
31 .collect()
32 }
33
34 pub fn overrides(&self) -> Vec<XlsxOverride> {
36 self.entries
37 .iter()
38 .filter_map(|e| match e {
39 XlsxContentTypeEntry::Override(o) => Some(o.clone()),
40 _ => None,
41 })
42 .collect()
43 }
44
45 pub fn entries_mut(&mut self) -> &mut Vec<XlsxContentTypeEntry> {
47 &mut self.entries
48 }
49}
50
51#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
53pub enum XlsxContentTypeEntry {
54 #[serde(rename = "Default")]
55 Default(XlsxDefault),
56 #[serde(rename = "Override")]
57 Override(XlsxOverride),
58}
59
60#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
62pub struct XlsxOverride {
63 #[serde(rename = "@PartName")]
64 pub part_name: String,
65 #[serde(rename = "@ContentType")]
66 pub content_type: String,
67}
68
69#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
71pub struct XlsxDefault {
72 #[serde(rename = "@Extension")]
73 pub extension: String,
74 #[serde(rename = "@ContentType")]
75 pub content_type: String,
76}
77
78#[cfg(test)]
79mod tests {
80 use super::*;
81 use quick_xml::de::from_str;
82
83 #[test]
84 fn deserialize_template() {
85 let s = crate::constants::XML_HEADER.to_string() + crate::templates::TEMPLATE_CONTENT_TYPES;
86 let ct: XlsxTypes = from_str(&s).unwrap();
87 assert_eq!(ct.defaults().len(), 2);
88 assert_eq!(ct.overrides().len(), 6);
89 }
90}