ezlua 0.2.1

Ergonomic, efficient and Zero-cost rust bindings to Lua5.4
Documentation
use std::cell::{Ref, RefCell, RefMut};

use ezlua::prelude::*;

struct Test {
    a: i32,
}

impl UserData for Test {
    type Trans = RefCell<Self>;

    fn methods(mt: UserdataRegistry<Self>) -> LuaResult<()> {
        mt.register("inc", |mut this: RefMut<Self>| this.a += 1)?;
        Ok(())
    }

    fn getter(fields: UserdataRegistry<Self>) -> LuaResult<()> {
        fields.register("a", |this: Ref<Self>| this.a)?;
        Ok(())
    }

    fn setter(fields: UserdataRegistry<Self>) -> LuaResult<()> {
        fields.register("a", |mut this: RefMut<Self>, val: i32| this.a = val)?;
        Ok(())
    }
}

fn main() {
    let s = Lua::with_open_libs();

    let uv = s.new_val(Test { a: 0 }).unwrap();
    assert_eq!(uv.type_of(), LuaType::Userdata);

    s.global().set("uv", uv).unwrap();
    let test_value = 0x11223344;
    s.global().register("test", move || test_value).unwrap();
    s.global()
        .register("toiter", || StaticIter::new(0..3))
        .unwrap();
    s.do_string(
        r#"
        local iter = toiter()
        assert(iter() == 0)
        assert(iter() == 1)
        assert(iter() == 2)
    "#,
        None,
    )
    .unwrap();

    s.do_string("assert(test() == 0x11223344)", None).unwrap();

    s.do_string("print(getmetatable(uv), type(uv))", None)
        .unwrap();
    s.do_string("assert(uv.a == 0)", None).unwrap();
    s.do_string("uv:inc(); assert(uv.a == 1)", None).unwrap();
    s.do_string("uv.a = 3; assert(uv.a == 3)", None).unwrap();
}