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/register.rs | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) (limited to 'src/sheet/register.rs') 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