use mlua::{Error, FromLua, Function, Lua, RegistryKey, Value}; #[derive(Debug)] pub struct OwnedFunction { key: RegistryKey, } impl OwnedFunction { pub fn new<'lua>(value: Value<'lua>, lua: &'lua Lua) -> Self { let key = lua.create_registry_value(value).unwrap(); Self { key } } pub fn get<'lua>(&self, lua: &'lua Lua) -> Function<'lua> { lua.registry_value(&self.key).unwrap() } } impl<'lua> FromLua<'lua> for OwnedFunction { fn from_lua(value: Value<'lua>, lua: &'lua Lua) -> mlua::prelude::LuaResult { if value.is_function() { Ok(OwnedFunction::new(value, lua)) } else { Err(Error::runtime("value needs to be function")) } } }