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();
}