#![cfg(feature = "derive")]
use lua_rs_runtime::{lua_methods, AnyUserData, Lua, LuaUserData, UserData, UserDataMethods};
#[derive(LuaUserData)]
#[lua(methods)]
struct Knob {
setting: i64,
}
#[lua_methods]
impl Knob {
pub fn turn(&mut self, by: i64) -> i64 {
self.setting += by;
self.setting
}
pub fn read(&self) -> i64 {
self.setting
}
}
struct Panel {
knob: Knob,
}
impl UserData for Panel {
fn add_methods<M: UserDataMethods<Self>>(m: &mut M) {
m.add_function("knob", |lua, this: AnyUserData| {
this.delegate::<Panel, Knob, _>(lua, |p| &mut p.knob)
});
}
}
#[test]
fn lua_methods_type_works_as_owned_userdata() {
let lua = Lua::new();
let knob = lua.create_userdata(Knob { setting: 10 }).unwrap();
lua.globals().set("k", &knob).unwrap();
let out: i64 = lua.load("k:turn(5); return k:read()").eval().unwrap();
assert_eq!(out, 15);
}
#[test]
fn lua_methods_type_works_as_scoped_userdata() {
let lua = Lua::new();
let mut knob = Knob { setting: 100 };
let out: i64 = lua
.scope(|s| {
let ud = s.create_userdata_ref_mut(&lua, &mut knob)?;
lua.globals().set("k", &ud)?;
lua.load("k:turn(-30); return k:read()").eval()
})
.unwrap();
assert_eq!(out, 70);
assert_eq!(knob.setting, 70);
}
#[test]
fn lua_methods_type_works_as_delegate() {
let lua = Lua::new();
let mut panel = Panel {
knob: Knob { setting: 0 },
};
let out: i64 = lua
.scope(|s| {
let ud = s.create_userdata_ref_mut(&lua, &mut panel)?;
lua.globals().set("panel", &ud)?;
lua.load(
r#"
local kn = panel:knob()
kn:turn(3)
kn:turn(4)
return kn:read()
"#,
)
.eval()
})
.unwrap();
assert_eq!(out, 7);
assert_eq!(panel.knob.setting, 7);
}