From fe0938b1de0c46fc2afcaa3dcd6a0f4ec870d21a Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Fri, 2 Aug 2024 00:36:10 +0200 Subject: add state which is shared with the lua environment --- src/sheet/cell.rs | 10 +++++----- src/sheet/mod.rs | 16 +++++++++++++++- src/sheet/register.rs | 33 +++++++++++++++++++++++++++++---- 3 files changed, 49 insertions(+), 10 deletions(-) (limited to 'src/sheet') diff --git a/src/sheet/cell.rs b/src/sheet/cell.rs index 3b18bde..b46b7d4 100644 --- a/src/sheet/cell.rs +++ b/src/sheet/cell.rs @@ -85,7 +85,7 @@ pub struct CellRef { row: usize, column: usize, sheet_id: SheetId, - cell: Cell, + value: Cell, } impl CellRef { @@ -98,7 +98,7 @@ impl CellRef { sheet_id, row, column, - cell + value: cell } } @@ -109,18 +109,18 @@ impl CellRef { sheet_id, row, column, - cell: cell.clone(), + value: cell.clone(), }) }) .unwrap_or(None) } pub fn value(&self) -> Cell { - self.cell.clone() + self.value.clone() } pub fn set_value(&mut self, cell: Cell) { - self.cell = cell.clone(); + self.value = cell.clone(); Register::get(self.sheet_id) .unwrap() .write() diff --git a/src/sheet/mod.rs b/src/sheet/mod.rs index f67d55e..501b71e 100644 --- a/src/sheet/mod.rs +++ b/src/sheet/mod.rs @@ -90,7 +90,7 @@ impl Clone for Sheet { } } -struct SheetLuaRef { +pub struct SheetLuaRef { id: SheetId, } @@ -98,6 +98,10 @@ impl SheetLuaRef { pub fn new(id: SheetId) -> Self { Self { id } } + + pub fn id(&self) -> SheetId { + self.id + } } impl LuaUserData for SheetLuaRef { @@ -122,3 +126,13 @@ impl LuaUserData for SheetLuaRef { }) } } + +impl<'lua> FromLua<'lua> for SheetLuaRef { + fn from_lua(value: LuaValue<'lua>, _: &'lua Lua) -> LuaResult { + if let Some(ud) = value.as_userdata() { + ud.take() + } else { + Err(LuaError::runtime("failed to parse sheet")) + } + } +} diff --git a/src/sheet/register.rs b/src/sheet/register.rs index 4fca3a3..039c6f0 100644 --- a/src/sheet/register.rs +++ b/src/sheet/register.rs @@ -1,8 +1,8 @@ use std::sync::{Arc, RwLock}; -use mlua::{UserData, Value}; +use mlua::{Table, UserData, Value}; -use super::{Sheet, SheetLuaRef}; +use super::{cell::Cell, Sheet, SheetLuaRef}; static REGISTER: RwLock>>> = RwLock::new(Vec::new()); @@ -21,6 +21,31 @@ impl Register { id } + pub fn create_from_table(table: Table) -> mlua::Result { + let mut register = REGISTER.write().unwrap(); + let id = register.len(); + + let height = table.len()? as usize; + let mut width: usize = 0; + + for column in table.clone().pairs::() { + width = width.max(column?.1.len()? as usize) + } + + let mut sheet = Sheet::new(width, height, id); + + for row_res in table.pairs::() { + let (row, c) = row_res?; + for column_res in c.pairs::() { + let (column, cell) = column_res?; + sheet.set_cell(row, column, cell) + } + } + + register.push(Arc::new(RwLock::new(sheet))); + Ok(id) + } + pub fn get(id: SheetId) -> Option>> { let register = REGISTER.read().unwrap(); @@ -34,8 +59,8 @@ impl Register { impl UserData for Register { fn add_methods<'lua, M: mlua::UserDataMethods<'lua, Self>>(methods: &mut M) { - methods.add_function_mut("create", |lua, (width, height): (usize, usize)| { - let id = Register::create(width, height); + methods.add_function_mut("create", |lua, table: Table| { + let id = Register::create_from_table(table)?; let luaref = SheetLuaRef::new(id); if let Ok(ud) = lua.create_userdata(luaref) { Ok(Value::UserData(ud)) -- cgit v1.2.3-70-g09d2