#[macro_use]
extern crate hlist_macro;
extern crate rlua;
use rlua::*;
fn examples() -> LuaResult<()> {
let lua = Lua::new();
lua.set("string_var", "hello")?;
lua.set("int_var", 42)?;
assert_eq!(lua.get::<_, String>("string_var")?, "hello");
assert_eq!(lua.get::<_, i64>("int_var")?, 42);
lua.load(r#"
global = 'foo'..'bar'
"#,
Some("example code"))?;
assert_eq!(lua.get::<_, String>("global")?, "foobar");
assert_eq!(lua.eval::<i32>("1 + 1")?, 2);
assert_eq!(lua.eval::<bool>("false == false")?, true);
assert_eq!(lua.eval::<i32>("return 1 + 2")?, 3);
let array_table = lua.create_empty_table()?;
array_table.set(1, "one")?;
array_table.set(2, "two")?;
array_table.set(3, "three")?;
assert_eq!(array_table.length()?, 3);
let map_table = lua.create_empty_table()?;
map_table.set("one", 1)?;
map_table.set("two", 2)?;
map_table.set("three", 3)?;
let v: i64 = map_table.get("two")?;
assert_eq!(v, 2);
lua.set("array_table", array_table)?;
lua.set("map_table", map_table)?;
lua.eval::<()>(r#"
for k, v in pairs(array_table) do
print(k, v)
end
for k, v in pairs(map_table) do
print(k, v)
end
"#)?;
let print: LuaFunction = lua.get("print")?;
print.call::<_, ()>("hello from rust")?;
print
.call::<_, ()>(hlist!["hello", "again", "from", "rust"])?;
let check_equal = lua.create_function(|lua, args| {
let hlist_pat![list1, list2] = lua.unpack::<HList![Vec<String>, Vec<String>]>(args)?;
lua.pack(list1 == list2)
})?;
lua.set("check_equal", check_equal)?;
let join = lua.create_function(|lua, args| {
let strings = lua.unpack::<LuaVariadic<String>>(args)?.0;
lua.pack(strings.iter().fold("".to_owned(), |a, b| a + b))
})?;
lua.set("join", join)?;
assert_eq!(lua.eval::<bool>(r#"check_equal({"a", "b", "c"}, {"a", "b", "c"})"#)?,
true);
assert_eq!(lua.eval::<bool>(r#"check_equal({"a", "b", "c"}, {"d", "e", "f"})"#)?,
false);
assert_eq!(lua.eval::<String>(r#"join("a", "b", "c")"#)?, "abc");
#[derive(Copy, Clone)]
struct Vec2(f32, f32);
impl LuaUserDataType for Vec2 {
fn add_methods(methods: &mut LuaUserDataMethods<Self>) {
methods.add_method("magnitude", |lua, vec, _| {
let mag_squared = vec.0 * vec.0 + vec.1 * vec.1;
lua.pack(mag_squared.sqrt())
});
methods.add_meta_function(LuaMetaMethod::Add, |lua, params| {
let hlist_pat![vec1, vec2] = lua.unpack::<HList![Vec2, Vec2]>(params)?;
lua.pack(Vec2(vec1.0 + vec2.0, vec1.1 + vec2.1))
});
}
}
let vec2_constructor = lua.create_function(|lua, args| {
let hlist_pat![x, y] = lua.unpack::<HList![f32, f32]>(args)?;
lua.pack(Vec2(x, y))
})?;
lua.set("vec2", vec2_constructor)?;
assert_eq!(lua.eval::<f32>("(vec2(1, 2) + vec2(2, 2)):magnitude()")?,
5.0);
Ok(())
}
fn main() {
examples().unwrap();
}