summaryrefslogtreecommitdiff
path: root/src/sheet
diff options
context:
space:
mode:
Diffstat (limited to 'src/sheet')
-rw-r--r--src/sheet/cell.rs10
-rw-r--r--src/sheet/mod.rs16
-rw-r--r--src/sheet/register.rs33
3 files changed, 49 insertions, 10 deletions
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<Self> {
+ 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<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))