diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-08-02 00:36:10 +0200 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-08-02 00:36:10 +0200 |
| commit | fe0938b1de0c46fc2afcaa3dcd6a0f4ec870d21a (patch) | |
| tree | 8db7509894842395cfb309f00c41b7f4d173888c /src/sheet/register.rs | |
| parent | 1e1eb95926f556e666bc20355327abd24d264858 (diff) | |
add state which is shared with the lua environment
Diffstat (limited to 'src/sheet/register.rs')
| -rw-r--r-- | src/sheet/register.rs | 33 |
1 files changed, 29 insertions, 4 deletions
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<Vec<Arc<RwLock<Sheet>>>> = RwLock::new(Vec::new()); @@ -21,6 +21,31 @@ impl Register { id } + pub fn create_from_table(table: Table) -> mlua::Result<SheetId> { + 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::<usize, Table>() { + width = width.max(column?.1.len()? as usize) + } + + let mut sheet = Sheet::new(width, height, id); + + for row_res in table.pairs::<usize, Table>() { + let (row, c) = row_res?; + for column_res in c.pairs::<usize, Cell>() { + 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<Arc<RwLock<Sheet>>> { 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)) |