summaryrefslogtreecommitdiff
path: root/src/sheet/register.rs
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2024-08-02 00:36:10 +0200
committerNathan Reiner <nathan@nathanreiner.xyz>2024-08-02 00:36:10 +0200
commitfe0938b1de0c46fc2afcaa3dcd6a0f4ec870d21a (patch)
tree8db7509894842395cfb309f00c41b7f4d173888c /src/sheet/register.rs
parent1e1eb95926f556e666bc20355327abd24d264858 (diff)
add state which is shared with the lua environment
Diffstat (limited to 'src/sheet/register.rs')
-rw-r--r--src/sheet/register.rs33
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))