diff options
Diffstat (limited to 'src/sheet/tablized.rs')
| -rw-r--r-- | src/sheet/tablized.rs | 60 |
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")) + } +} |