From b747ca8af52129876b577a4f20f7105a05c6b002 Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Sat, 10 Aug 2024 15:41:31 +0200 Subject: add global fileloader registry --- src/sheet/tablized.rs | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/sheet/tablized.rs (limited to 'src/sheet/tablized.rs') 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>), + 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 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 { + 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")) + } +} -- cgit v1.2.3-70-g09d2