Skip to main content

excelize_rs/xml/
content_types.rs

1//! Content types part (`[Content_Types].xml`).
2//!
3//! Ported from Go `xmlContentTypes.go`.
4
5use serde::{Deserialize, Serialize};
6
7// ------------------------------------------------------------------
8// Content types container
9// ------------------------------------------------------------------
10
11/// Directly maps the `Types` element of the content types part.
12#[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    /// Mixed `Default` and `Override` entries under the root `Types` element.
18    #[serde(rename = "$value", default)]
19    pub entries: Vec<XlsxContentTypeEntry>,
20}
21
22impl XlsxTypes {
23    /// Return all `Default` entries.
24    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    /// Return all `Override` entries.
35    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    /// Iterate over entries mutably.
46    pub fn entries_mut(&mut self) -> &mut Vec<XlsxContentTypeEntry> {
47        &mut self.entries
48    }
49}
50
51/// A single child of the `Types` element.
52#[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/// Maps the `Override` element.
61#[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/// Maps the `Default` element.
70#[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}