use anyhow::bail;
#[cfg(feature = "serde")]
use serde::Serialize;
use crate::{
packaging::relationship::{zip_path_for_id, XlsxRelationships},
raw::spreadsheet::workbook::sheet::XlsxSheet,
};
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize))]
pub struct SheetBasicInfo {
pub r_id: String,
pub name: String,
pub sheet_id: u64,
pub visible_state: SheetVisibleState,
pub r#type: SheetType,
#[cfg_attr(feature = "serde", serde(skip_serializing))]
pub(crate) path: String,
}
impl SheetBasicInfo {
pub(crate) fn from_raw(
sheet: XlsxSheet,
relationships: &XlsxRelationships,
) -> anyhow::Result<Self> {
let (Some(id), Some(name), Some(sheet_id)) = (sheet.id, sheet.name, sheet.sheet_id) else {
bail!("neccessary properties for sheet are not present.")
};
let Some(path) = zip_path_for_id(relationships, &id) else {
bail!("Cannot find the xml file for the sheet.")
};
let sheet_type = match path.split('/').nth(1) {
Some("worksheets") => SheetType::WorkSheet,
Some("chartsheets") => SheetType::ChartSheet,
Some("dialogsheets") => SheetType::DialogSheet,
Some(t) => bail!("Unsupported sheet type: {}", t),
None => bail!("sheet type not availalbe."),
};
let visibility = match sheet.visible_state.unwrap_or("visible".to_owned()).as_ref() {
"visible" => SheetVisibleState::Visible,
"hidden" => SheetVisibleState::Hidden,
"veryHidden" => SheetVisibleState::VeryHidden,
state => bail!("unknown sheet visible state: {}", state),
};
return Ok(Self {
r_id: id,
name,
sheet_id,
visible_state: visibility,
r#type: sheet_type,
path,
});
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
pub enum SheetType {
WorkSheet,
DialogSheet,
ChartSheet,
}
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
pub enum SheetVisibleState {
Visible,
Hidden,
VeryHidden,
}