summaryrefslogtreecommitdiff
path: root/src/sheet/tablized.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/sheet/tablized.rs')
-rw-r--r--src/sheet/tablized.rs60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/sheet/tablized.rs b/src/sheet/tablized.rs
new file mode 100644
index 0000000..a40af0d
--- /dev/null
+++ b/src/sheet/tablized.rs
@@ -0,0 +1,60 @@
+use mlua::{FromLuaMulti, Lua, RegistryKey};
+
+use super::{
+ cell::Cell,
+ register::{Register, SheetId},
+};
+
+pub enum Tablized {
+ Vector(Vec<Vec<Cell>>),
+ Table(RegistryKey),
+}
+
+impl Tablized {
+ pub fn to_sheet(&self, lua: &Lua) -> mlua::Result<SheetId> {
+ match self {
+ Tablized::Vector(v) => {
+ let rows = v.len();
+ let columns = v
+ .iter()
+ .max_by_key(|v| v.len())
+ .unwrap_or(&Vec::new())
+ .len();
+
+ let id = Register::create(columns, rows);
+ let lock = Register::get(id).unwrap();
+ let mut sheet = lock.write().unwrap();
+
+ for row in 0..rows {
+ for column in 0..columns {
+ if let Some(value) = v.get(row).and_then(|c| c.get(column)) {
+ sheet.set_cell(row, column, value.clone())
+ }
+ }
+ }
+
+ Ok(id)
+ }
+ Tablized::Table(key) => {
+ let table = lua.registry_value(key)?;
+ Register::create_from_table(table)
+ },
+ }
+ }
+}
+
+impl<'lua> FromLuaMulti<'lua> for Tablized {
+ fn from_lua_multi(
+ values: mlua::prelude::LuaMultiValue<'lua>,
+ lua: &'lua mlua::prelude::Lua,
+ ) -> mlua::prelude::LuaResult<Self> {
+ if let Some(value) = values.get(0) {
+ if value.is_table() {
+ let key = lua.create_registry_value(value)?;
+ return Ok(Self::Table(key));
+ }
+ }
+
+ Err(mlua::Error::runtime("table needed"))
+ }
+}