retex-lua 1.3.0

Embedded Lua and the LuaTeX Lua API for retex
Documentation
//! The `lua` library (LuaTeX manual ยง4.1): chunk names, bytecode
//! registers and the function table.

use mlua::{Function, Lua, Table, Value};

/// Installs `lua` (merged into Lua's own globals).
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(())
}