use mlua_extras::{
extras::{LuaExtras, Require},
mlua::{self, Function, Lua, Table, UserData, Value, Variadic},
};
struct MyModule;
impl UserData for MyModule {
fn add_fields<'lua, F: mlua::prelude::LuaUserDataFields<'lua, Self>>(fields: &mut F) {
fields.add_field("data", "Some Data");
}
fn add_methods<'lua, M: mlua::prelude::LuaUserDataMethods<'lua, Self>>(methods: &mut M) {
methods.add_function("print", |_lua, values: Variadic<Value>| {
println!(
"{}",
values
.iter()
.map(|v| v.to_string())
.collect::<mlua::Result<Vec<_>>>()?
.join(" ")
);
Ok(())
});
}
}
const CODE: &str = r#"data = {
first = "key",
second = "value"
}
print("KEYS: ", table.unpack(table.keys(data)))
print("VALUES: ", table.unpack(table.values(data)))
mymodule.print(mymodule.data)
"#;
fn main() -> mlua::Result<()> {
let lua = Lua::new();
let table = lua.require::<Table>("table")?;
let _unpack = table.require::<Function>("unpack")?;
lua.set_global("mymodule", MyModule)?;
{
let temp = lua.create_table()?;
temp.set("mymodule", MyModule)?;
}
if let Err(err) = lua.load(CODE).eval::<Value>() {
eprintln!("{err}");
}
Ok(())
}