use mlua::{Function, Lua, Table, Value};
pub fn install(lua: &Lua) -> mlua::Result<()> {
let t = lua.create_table()?;
t.set("name", lua.create_table()?)?;
let bytecode = lua.create_table()?;
t.set("bytecode", bytecode.clone())?;
let functions = lua.create_table()?;
lua.set_named_registry_value("retex.functions", functions.clone())?;
t.set(
"get_functions_table",
lua.create_function(|lua, ()| lua.named_registry_value::<Table>("retex.functions"))?,
)?;
t.set(
"getbytecode",
lua.create_function(move |_, n: i64| bytecode.get::<Value>(n))?,
)?;
let bc2: Table = t.get("bytecode")?;
t.set(
"setbytecode",
lua.create_function(move |_, (n, f): (i64, Option<Function>)| bc2.set(n, f))?,
)?;
t.set("version", "Lua 5.3")?;
t.set(
"setluaname",
lua.create_function(|lua, (name, n): (String, i64)| {
let lt: Table = lua.globals().get("lua")?;
let names: Table = lt.get("name")?;
names.set(n, name)
})?,
)?;
t.set(
"getluaname",
lua.create_function(|lua, n: i64| {
let lt: Table = lua.globals().get("lua")?;
let names: Table = lt.get("name")?;
names.get::<Value>(n)
})?,
)?;
t.set(
"newtable",
lua.create_function(|lua, (_a, _h): (Option<i64>, Option<i64>)| lua.create_table())?,
)?;
t.set("getstacktop", lua.create_function(|_, ()| Ok(0))?)?;
lua.globals().set("lua", t)?;
Ok(())
}