//! Lua bindings for the macro recorder. //! //! Usage from Lua: //! jarvis.macros.start("работа") -- begin recording //! jarvis.macros.save() -- persist + stop //! jarvis.macros.cancel() -- abort without saving //! jarvis.macros.replay("работа") -- play back; returns step count or nil //! jarvis.macros.list() -- array of {name, steps_count, last_run} //! jarvis.macros.delete(name) -- removes //! jarvis.macros.is_recording() -- bool //! jarvis.macros.recording_name() -- string or nil use mlua::{Lua, Table, Value}; use crate::macros; pub fn register(lua: &Lua, jarvis: &Table) -> mlua::Result<()> { let m = lua.create_table()?; m.set("start", lua.create_function(|_, name: String| { macros::start_recording(&name).map_err(mlua::Error::external) })?)?; m.set("save", lua.create_function(|_, ()| { macros::save_recording().map_err(mlua::Error::external) })?)?; m.set("cancel", lua.create_function(|_, ()| { Ok(macros::cancel_recording()) })?)?; m.set("is_recording", lua.create_function(|_, ()| { Ok(macros::is_recording()) })?)?; m.set("recording_name", lua.create_function(|lua, ()| { match macros::recording_name() { Some(n) => Ok(Value::String(lua.create_string(n)?)), None => Ok(Value::Nil), } })?)?; m.set("replay", lua.create_function(|_, name: String| { macros::replay(&name).map_err(mlua::Error::external) })?)?; m.set("delete", lua.create_function(|_, name: String| { Ok(macros::delete(&name)) })?)?; m.set("list", lua.create_function(|lua, ()| { let arr = lua.create_table()?; for (i, mac) in macros::list().iter().enumerate() { let row = lua.create_table()?; row.set("name", mac.name.clone())?; row.set("steps_count", mac.steps.len())?; row.set("created_at", mac.created_at)?; let last: Value = match mac.last_run { Some(ts) => Value::Integer(ts), None => Value::Nil, }; row.set("last_run", last)?; arr.set(i + 1, row)?; } Ok(arr) })?)?; jarvis.set("macros", m)?; Ok(()) }