summaryrefslogtreecommitdiff
path: root/src/sheet/foreach.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/sheet/foreach.rs')
-rw-r--r--src/sheet/foreach.rs37
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(())
+ }
+}