Skip to main content

cadmpeg_ir/
spreadsheets.rs

1// SPDX-License-Identifier: Apache-2.0
2//! Neutral spreadsheet structure and layout.
3
4use schemars::JsonSchema;
5use serde::{Deserialize, Serialize};
6
7use crate::features::{FeatureId, ParameterId};
8
9/// Stable spreadsheet identity.
10#[derive(
11    Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize, JsonSchema,
12)]
13#[serde(transparent)]
14pub struct SpreadsheetId(pub String);
15
16/// One sheet and its ordered cell/layout state.
17#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
18pub struct Spreadsheet {
19    /// Globally unique sheet id.
20    pub id: SpreadsheetId,
21    /// Feature-tree node owning this sheet.
22    pub feature: FeatureId,
23    /// Used cells in persistence order.
24    pub cells: Vec<ParameterId>,
25    /// Non-default column widths.
26    #[serde(default, skip_serializing_if = "Vec::is_empty")]
27    pub column_widths: Vec<SpreadsheetDimension>,
28    /// Non-default row heights.
29    #[serde(default, skip_serializing_if = "Vec::is_empty")]
30    pub row_heights: Vec<SpreadsheetDimension>,
31    /// Merged rectangular ranges.
32    #[serde(default, skip_serializing_if = "Vec::is_empty")]
33    pub merged_ranges: Vec<SpreadsheetRange>,
34    /// Full-fidelity source sheet record.
35    #[serde(default, skip_serializing_if = "Option::is_none")]
36    pub native_ref: Option<String>,
37}
38
39/// One explicitly sized spreadsheet row or column.
40#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
41pub struct SpreadsheetDimension {
42    /// Row number or column label exactly as persisted.
43    pub name: String,
44    /// Display size in source UI pixels.
45    pub pixels: u32,
46}
47
48/// Inclusive rectangular spreadsheet range.
49#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
50pub struct SpreadsheetRange {
51    /// Top-left cell address.
52    pub start: String,
53    /// Bottom-right cell address.
54    pub end: String,
55}