summaryrefslogtreecommitdiff
path: root/src/lua
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2024-08-08 21:46:54 +0200
committerNathan Reiner <nathan@nathanreiner.xyz>2024-08-08 21:46:54 +0200
commit4763d8ce3b833df1e7321a407b08666f69657fdb (patch)
tree472e38eedef269c244726083bab94afa2942d945 /src/lua
parent41d707480f2138a8a9b00b4efac4c87ed0eb79fc (diff)
refactore runnable
Diffstat (limited to 'src/lua')
-rw-r--r--src/lua/mod.rs1
-rw-r--r--src/lua/ownedfunction.rs12
-rw-r--r--src/lua/runnable.rs42
3 files changed, 54 insertions, 1 deletions
diff --git a/src/lua/mod.rs b/src/lua/mod.rs
index e10d83b..afa6171 100644
--- a/src/lua/mod.rs
+++ b/src/lua/mod.rs
@@ -19,6 +19,7 @@ pub mod evalsto;
pub mod iobuffer;
pub mod ownedfunction;
pub mod runtime;
+pub mod runnable;
lazy_static! {
static ref LUA: Mutex<Lua> = {
diff --git a/src/lua/ownedfunction.rs b/src/lua/ownedfunction.rs
index a8d81cf..54e39df 100644
--- a/src/lua/ownedfunction.rs
+++ b/src/lua/ownedfunction.rs
@@ -1,4 +1,4 @@
-use mlua::{Function, Lua, RegistryKey, Value};
+use mlua::{Error, FromLua, Function, Lua, RegistryKey, Value};
#[derive(Debug)]
pub struct OwnedFunction {
@@ -15,3 +15,13 @@ impl OwnedFunction {
lua.registry_value(&self.key).unwrap()
}
}
+
+impl<'lua> FromLua<'lua> for OwnedFunction {
+ fn from_lua(value: Value<'lua>, lua: &'lua Lua) -> mlua::prelude::LuaResult<Self> {
+ if value.is_function() {
+ Ok(OwnedFunction::new(value, lua))
+ } else {
+ Err(Error::runtime("value needs to be function"))
+ }
+ }
+}
diff --git a/src/lua/runnable.rs b/src/lua/runnable.rs
new file mode 100644
index 0000000..adda512
--- /dev/null
+++ b/src/lua/runnable.rs
@@ -0,0 +1,42 @@
+use mlua::{FromLuaMulti, Function, IntoLuaMulti, Lua, Result};
+
+use super::ownedfunction::OwnedFunction;
+
+pub trait Runnable<A, R>
+where
+ Self: Send,
+{
+ fn run<'lua>(&self, arg: A, lua: &'lua Lua) -> Result<R>
+ where
+ A: IntoLuaMulti<'lua>,
+ R: FromLuaMulti<'lua>;
+}
+
+impl<A, R, T> Runnable<A, R> for T
+where
+ T: Fn(A) -> R,
+ Self: Send,
+{
+ fn run<'lua>(&self, arg: A, _: &'lua Lua) -> Result<R>
+ where
+ A: IntoLuaMulti<'lua>,
+ R: FromLuaMulti<'lua>,
+ {
+ Ok(self(arg))
+ }
+}
+
+impl<A, R> Runnable<A, R> for OwnedFunction
+where
+ Self: Send,
+{
+ fn run<'lua>(&self, arg: A, lua: &'lua Lua) -> Result<R>
+ where
+ A: IntoLuaMulti<'lua>,
+ R: FromLuaMulti<'lua>,
+ {
+ let func: Function = self.get(lua);
+ func.call::<A, R>(arg)
+ }
+}
+