pm_rlua 0.1.0

Zero-cost high-level lua 5.3 wrapper for Rust. Some fixes for td_rlua.
Documentation
extern crate pm_rlua;

use pm_rlua::{Lua, LuaTable};

#[test]
fn iterable() {
    let mut lua = Lua::new();

    let _: () = lua.exec_string("a = { 9, 8, 7 }").unwrap();

    let mut table: LuaTable = lua.query("a").unwrap();
    let mut counter = 0;

    for (key, value) in table.iter().filter_map(|e| e) {
        let _: u32 = key;
        let _: u32 = value;
        assert_eq!(key + value, 10);
        counter += 1;
    }

    assert_eq!(counter, 3);
}

#[test]
fn iterable_multipletimes() {
    let mut lua = Lua::new();

    let _: () = lua.exec_string("a = { 9, 8, 7 }").unwrap();

    let mut table: LuaTable = lua.query("a").unwrap();

    for _ in 0..10 {
        let table_content: Vec<Option<(u32, u32)>> = table.iter().collect();
        assert_eq!(
            table_content,
            vec![Some((1, 9)), Some((2, 8)), Some((3, 7))]
        );
    }
}

#[test]
fn get_set() {
    let mut lua = Lua::new();

    let _: () = lua.exec_string("a = { 9, 8, 7 }").unwrap();
    let mut table: LuaTable = lua.query("a").unwrap();

    let x: i32 = table.query(2).unwrap();
    assert_eq!(x, 8);

    table.set(3, "hello");
    let y: String = table.query(3).unwrap();
    assert_eq!(y, "hello");

    let z: i32 = table.query(1).unwrap();
    assert_eq!(z, 9);
}

#[test]
fn table_over_table() {
    let mut lua = Lua::new();

    let _: () = lua.exec_string("a = { 10, { 8, 7 }, 6 }").unwrap();
    let mut table: LuaTable = lua.query("a").unwrap();

    let x: i32 = table.query(1).unwrap();
    assert_eq!(x, 10);

    {
        let mut subtable: LuaTable = table.query(2).unwrap();

        let y: i32 = subtable.query(1).unwrap();
        assert_eq!(y, 8);

        let z: i32 = subtable.query(2).unwrap();
        assert_eq!(z, 7);
    }

    let w: i32 = table.query(3).unwrap();
    assert_eq!(w, 6);
}

#[test]
fn metatable() {
    let mut lua = Lua::new();

    let _: () = lua.exec_string("a = { 9, 8, 7 }").unwrap();

    {
        let mut table: LuaTable = lua.query("a").unwrap();

        let mut metatable = table.get_or_create_metatable();
        fn handler() -> i32 {
            5
        };
        metatable.set("__add".to_string(), pm_rlua::function0(handler));
    }

    let r: i32 = lua.exec_string("return a + a").unwrap();
    assert_eq!(r, 5);
}

#[test]
fn empty_array() {
    let mut lua = Lua::new();

    {
        let mut array = lua.empty_table("a");
        array.set("b", 3)
    }

    let mut table: LuaTable = lua.query("a").unwrap();
    assert!(3 == table.query("b").unwrap());
}