use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
pub struct ArrayLayoutSummary {
#[serde(skip_serializing_if = "Option::is_none")]
pub format_version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", alias = "descr")]
pub dtype: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub shape: Option<Vec<usize>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub fortran_order: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub header_region_bytes: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data_offset: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data_region_bytes: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expected_data_bytes_from_dtype: Option<usize>,
}
impl ArrayLayoutSummary {
#[must_use]
pub fn table_dims(&self) -> Option<(usize, usize)> {
let shape = self.shape.as_deref()?;
match shape.len() {
0 => Some((1, 1)),
1 => Some((shape[0], 1)),
2 => Some((shape[0], shape[1])),
_ => None,
}
}
#[must_use]
pub fn shape_row_col_counts(&self) -> Option<(usize, usize)> {
let shape = self.shape.as_deref()?;
if let Some((r, c)) = self.table_dims() {
Some((r, c))
} else {
let n: usize = shape.iter().product();
Some((n, 0))
}
}
}
pub type NpyLayoutSummary = ArrayLayoutSummary;