wip: ironcalc model helper methods

This commit is contained in:
Jeremy Wall 2024-11-13 19:02:41 -05:00
parent 42af12448d
commit df4416aace

View File

@ -1,20 +1,68 @@
use anyhow::{anyhow, Result};
use ironcalc::base::{Model, types::{Worksheet, SheetData}};
/// A spreadsheet book with some internal state tracking.
pub struct Book {
model: Model,
current_sheet: u32,
current_location: (u32, u32),
current_location: (i32, i32),
}
impl Book {
/// Get the currently set sheets name.
pub fn get_sheet_name(&self) -> Result<&str> {
Ok(&self.get_sheet()?.name)
}
/// Get the sheet data for the current worksheet.
pub fn get_sheet_data(&self) -> Result<&SheetData> {
Ok(&self.get_sheet()?.sheet_data)
}
/// Get a cells formatted content.
pub fn get_cell_rendered(&self) -> Result<String> {
Ok(self.model.get_formatted_cell_value(self.current_sheet, self.current_location.0, self.current_location.1)
.map_err(|s| anyhow!("Unable to format cell {}", s))?)
}
/// Get a cells actual content as a string.
pub fn get_cell_contents(&self) -> Result<String> {
Ok(self.model.get_cell_content(self.current_sheet, self.current_location.0, self.current_location.1)
.map_err(|s| anyhow!("Unable to format cell {}", s))?)
}
pub fn edit_cell(&mut self, value: String) -> Result<()> {
self.model.set_user_input(self.current_sheet, self.current_location.0, self.current_location.1, value).map_err(|e| anyhow!("Invalid cell contents: {}", e))?;
Ok(())
}
/// Get the current sheets dimensions. This is a somewhat expensive calculation.
pub fn get_dimensions(&self) -> Result<(usize, usize)> {
let dimensions = self.get_sheet()?.dimension();
Ok((dimensions.max_row.try_into()?, dimensions.max_column.try_into()?))
}
/// Select a sheet by name.
pub fn select_sheet_by_name(&mut self, name: &str) -> bool {
if let Some(sheet) = self.model.workbook.worksheets.iter().find(|sheet| sheet.name == name) {
self.current_sheet = sheet.sheet_id;
return true;
}
false
}
pub fn get_sheet_names(&self) -> Vec<String> {
self.model.workbook.get_worksheet_names()
}
/// Select a sheet by id.
pub fn select_sheet_by_id(&mut self, id: u32) -> bool {
if let Some(sheet) = self.model.workbook.worksheets.iter().find(|sheet| sheet.sheet_id == id) {
self.current_sheet = sheet.sheet_id;
return true;
}
false
}
fn get_sheet(&self) -> Result<&Worksheet> {
Ok(self.model.workbook.worksheet(self.current_sheet)