excel-cli 1.3.2

Excel CLI for AI, scripting, and terminal users. Headless JSON API for automation, plus a Vim-like TUI for interactive browsing and editing.
Documentation
use crate::excel::Cell;
use crate::utils::cell_reference;

pub const EXCEL_MAX_COLS: usize = 16_384;
pub const EXCEL_MAX_ROWS: usize = 1_048_576;

#[derive(Clone)]
pub struct FreezePanes {
    pub rows: usize,
    pub cols: usize,
}

impl FreezePanes {
    #[must_use]
    pub fn none() -> Self {
        Self { rows: 0, cols: 0 }
    }

    #[must_use]
    pub fn from_split_cell(row: usize, col: usize) -> Self {
        Self {
            rows: row.saturating_sub(1),
            cols: col.saturating_sub(1),
        }
    }

    #[must_use]
    pub fn is_frozen(&self) -> bool {
        self.rows > 0 || self.cols > 0
    }

    #[must_use]
    pub fn split_cell(&self) -> (usize, usize) {
        (self.rows + 1, self.cols + 1)
    }

    #[must_use]
    pub fn split_cell_ref(&self) -> String {
        cell_reference(self.split_cell())
    }
}

impl Default for FreezePanes {
    fn default() -> Self {
        Self::none()
    }
}

#[derive(Clone)]
pub struct Sheet {
    pub name: String,
    pub data: Vec<Vec<Cell>>,
    pub max_rows: usize,
    pub max_cols: usize,
    pub is_loaded: bool,
    pub freeze_panes: FreezePanes,
}

impl Sheet {
    #[must_use]
    pub fn blank(name: String) -> Self {
        Self {
            name,
            data: vec![vec![Cell::empty(); 2]; 2],
            max_rows: 1,
            max_cols: 1,
            is_loaded: true,
            freeze_panes: FreezePanes::none(),
        }
    }
}