jetkvm_control/
lua_engine.rs1#![cfg(feature = "lua")]
2use anyhow::Result as AnyResult;
5use mlua::prelude::*;
6use std::sync::Arc;
7use tokio::sync::Mutex;
8use tokio::time::Duration;
9
10use crate::jetkvm_control_svr_client;
11use crate::jetkvm_rpc_client::JetKvmRpcClient;
12use crate::keyboard;
13use crate::mouse;
14
15pub struct LuaEngine {
18 lua: Lua,
19 client: Arc<Mutex<JetKvmRpcClient>>,
20}
21
22impl LuaEngine {
23 pub fn new(client: Arc<Mutex<JetKvmRpcClient>>) -> Self {
25 let lua = Lua::new();
26 Self { lua, client }
27 }
28
29 pub fn register_delay(lua: &Lua) -> LuaResult<()> {
30 let delay_fn = lua.create_function(|_, millis: u64| {
31 std::thread::sleep(Duration::from_millis(millis)); Ok(())
33 })?;
34 lua.globals().set("delay", delay_fn)?;
35 Ok(())
36 }
44
45 pub fn register_builtin_functions(&self) -> LuaResult<()> {
47 keyboard::register_lua(&self.lua, self.client.clone())?;
48 mouse::register_lua(&self.lua, self.client.clone())?;
49 jetkvm_control_svr_client::register_lua(&self.lua)?;
50 Self::register_delay(&self.lua)?;
51 Ok(())
52 }
53
54 pub async fn exec_script(&self, script: &str) -> AnyResult<()> {
56 self.lua
57 .load(script)
58 .exec_async()
59 .await
60 .map_err(|e| e.into())
61 }
62
63 pub fn lua(&self) -> &Lua {
65 &self.lua
66 }
67}