diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-08-02 11:38:19 +0200 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-08-02 11:38:19 +0200 |
| commit | 04a5a938994ddb95cfaa9a74b180e457d3a2b5d0 (patch) | |
| tree | 31ce9525ed3f3423678397323b65c910d63eadb1 /src/sheet/foreach.rs | |
| parent | fe0938b1de0c46fc2afcaa3dcd6a0f4ec870d21a (diff) | |
implement new lua interface
Diffstat (limited to 'src/sheet/foreach.rs')
| -rw-r--r-- | src/sheet/foreach.rs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/sheet/foreach.rs b/src/sheet/foreach.rs new file mode 100644 index 0000000..a2a3f90 --- /dev/null +++ b/src/sheet/foreach.rs @@ -0,0 +1,37 @@ +use std::sync::{Arc, RwLock}; + +use mlua::prelude::*; + +use super::{cell::Cell, Sheet}; + +pub trait LuaForEach { + fn lua_foreach<'lua>( + &self, + func: LuaFunction<'lua>, + range: Vec<(usize, usize)>, + ) -> Result<(), LuaError>; +} + +impl LuaForEach for Arc<RwLock<Sheet>> { + fn lua_foreach<'lua>( + &self, + func: LuaFunction<'lua>, + range: Vec<(usize, usize)>, + ) -> Result<(), LuaError> { + let mut this = self.write().unwrap(); + let mut sheet = this.clone(); + + for (row, column) in range.iter() { + let cellref = this.get_ref(*row, *column); + + match func.call::<_, Cell>(cellref) { + Ok(cell) => sheet.set_cell(*row, *column, cell), + Err(error) => return Err(error), + } + } + + this.apply(sheet); + + Ok(()) + } +} |