use std::marker::PhantomData; use mlua::{FromLua, IntoLuaMulti}; #[derive(Debug, Clone)] struct Internal { uuid: uuid::Uuid, lua: mlua::Lua, } #[derive(Debug, Clone)] pub struct ActionCallback { internal: Option, phantom: PhantomData, } impl Default for ActionCallback { fn default() -> Self { Self { internal: None, phantom: PhantomData::, } } } impl FromLua for ActionCallback { fn from_lua(value: mlua::Value, lua: &mlua::Lua) -> mlua::Result { let uuid = uuid::Uuid::new_v4(); lua.set_named_registry_value(&uuid.to_string(), value)?; Ok(ActionCallback { internal: Some(Internal { uuid, lua: lua.clone(), }), phantom: PhantomData::, }) } } // TODO: Return proper error here impl ActionCallback where T: IntoLuaMulti + Sync + Send + Clone + 'static, { pub async fn call(&self, state: T) { let Some(internal) = self.internal.as_ref() else { return; }; let callback: mlua::Value = internal .lua .named_registry_value(&internal.uuid.to_string()) .unwrap(); match callback { mlua::Value::Function(f) => f.call_async::<()>(state).await.unwrap(), _ => todo!("Only functions are currently supported"), } } }