edit-xlsx 0.4.4

A quick and easy-to-use Rust library for Excel file editing.
Documentation
mod xda_dynamic_array_properties;
mod x15_workbook_pr;
mod x14_slicer_styles;
mod x15_timeline_styles;

use std::collections::HashSet;
use std::hash::{Hash, Hasher};
use serde::{Deserialize, Serialize};
use crate::xml::common::XmlnsAttrs;
use crate::xml::extension::x14_slicer_styles::X14SlicerStyles;
use crate::xml::extension::x15_timeline_styles::X15TimelineStyles;
use crate::xml::extension::x15_workbook_pr::X15WorkbookPr;
use crate::xml::extension::xda_dynamic_array_properties::XdaDynamicArrayProperties;

pub(crate) enum ExtensionType {
    X15WorkbookPr,
    X14SlicerStyles,
    X15TimelineStyles,
    XdaDynamicArrayProperties,
}

pub(crate) trait AddExtension {
    fn add_extension(&mut self, e: ExtensionType);
}

#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub(crate) struct ExtensionList {
    #[serde(rename = "ext")]
    ext: HashSet<Extension>,
}

impl ExtensionList {
    pub(crate) fn is_empty(&self) -> bool {
        self.ext.is_empty()
    }
}

impl AddExtension for ExtensionList {
    fn add_extension(&mut self, e: ExtensionType) {
        self.ext.insert(Extension::from_extension_type(e));
    }
}

#[derive(Debug, Clone, Deserialize, Serialize)]
struct Extension {
    #[serde(rename = "@uri")]
    uri: String,
    #[serde(rename = "@xmlns:x14", skip_serializing_if = "Option::is_none")]
    xmlns_x14: Option<String>,
    #[serde(rename = "@xmlns:x15", skip_serializing_if = "Option::is_none")]
    xmlns_x15: Option<String>,
    #[serde(rename(serialize = "x15:workbookPr", deserialize = "workbookPr"), skip_serializing_if = "Option::is_none")]
    x15_workbook_pr: Option<X15WorkbookPr>,
    #[serde(rename(serialize = "x14:slicerStyles", deserialize = "slicerStyles"), skip_serializing_if = "Option::is_none")]
    x14_slicer_styles: Option<X14SlicerStyles>,
    #[serde(rename(serialize = "x15:timelineStyles", deserialize = "timelineStyles"), skip_serializing_if = "Option::is_none")]
    x15_timeline_styles: Option<X15TimelineStyles>,
    #[serde(rename(serialize = "xda:dynamicArrayProperties", deserialize = "dynamicArrayProperties"), skip_serializing_if = "Option::is_none")]
    xda_dynamic_array_properties: Option<XdaDynamicArrayProperties>,
}

impl PartialEq for Extension {
    fn eq(&self, other: &Self) -> bool {
        self.uri.eq(&other.uri)
    }
}

impl Eq for Extension {}

impl Hash for Extension {
    fn hash<H: Hasher>(&self, state: &mut H) {
        self.uri.hash(state)
    }
}

impl Extension {
    fn from_extension_type(extension_type: ExtensionType) -> Self {
        match extension_type {
            ExtensionType::X15WorkbookPr => Self::new_x15_workbook_pr(),
            ExtensionType::X14SlicerStyles => Self::new_x14_slicer_styles(),
            ExtensionType::X15TimelineStyles => Self::new_x15_timeline_styles(),
            ExtensionType::XdaDynamicArrayProperties => Self::new_xda_dynamic_array_properties(),
        }
    }

    fn new_x15_workbook_pr() -> Self {
        Self {
            uri: "".to_string(),
            xmlns_x14: None,
            xmlns_x15: Some("http://schemas.microsoft.com/office/spreadsheetml/2010/11/main".to_string()),
            x15_workbook_pr: Some(Default::default()),
            x14_slicer_styles: None,
            x15_timeline_styles: None,
            xda_dynamic_array_properties: None,
        }
    }

    fn new_x14_slicer_styles() -> Self {
        Self {
            uri: "{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}".to_string(),
            xmlns_x14: Some("http://schemas.microsoft.com/office/spreadsheetml/2009/9/main".to_string()),
            xmlns_x15: None,
            x15_workbook_pr: None,
            x14_slicer_styles: Some(Default::default()),
            x15_timeline_styles: None,
            xda_dynamic_array_properties: None,
        }
    }

    fn new_x15_timeline_styles() -> Self {
        Self {
            uri: "{9260A510-F301-46a8-8635-F512D64BE5F5}".to_string(),
            xmlns_x14: None,
            xmlns_x15: Some("http://schemas.microsoft.com/office/spreadsheetml/2010/11/main".to_string()),
            x15_workbook_pr: None,
            x14_slicer_styles: None,
            x15_timeline_styles: Some(Default::default()),
            xda_dynamic_array_properties: None,
        }
    }

    fn new_xda_dynamic_array_properties() -> Self {
        Self {
            uri: "{bdbb8cdc-fa1e-496e-a857-3c3f30c029c3}".to_string(),
            xmlns_x14: None,
            xmlns_x15: None,
            x15_workbook_pr: None,
            x14_slicer_styles: None,
            x15_timeline_styles: None,
            xda_dynamic_array_properties: Some(Default::default()),
        }
    }
}