use mlua::{FromLuaMulti, Lua, RegistryKey}; use super::{ cell::Cell, register::{Register, SheetId}, }; pub enum Tablized { Vector(Vec>), Table(RegistryKey), } impl Tablized { pub fn to_sheet(&self, lua: &Lua) -> mlua::Result { 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 sheet = Register::get(id).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 { 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")) } }