46 lines
1.3 KiB
Rust
46 lines
1.3 KiB
Rust
use mlua::{chunk, Lua, MetaMethod, Result, UserData};
|
|
|
|
#[derive(Default)]
|
|
struct Rectangle {
|
|
length: u32,
|
|
width: u32,
|
|
}
|
|
|
|
impl UserData for Rectangle {
|
|
fn add_fields<'lua, F: mlua::UserDataFields<'lua, Self>>(fields: &mut F) {
|
|
fields.add_field_method_get("length", |_, this| Ok(this.length));
|
|
fields.add_field_method_set("length", |_, this, val| {
|
|
this.length = val;
|
|
Ok(())
|
|
});
|
|
fields.add_field_method_get("width", |_, this| Ok(this.width));
|
|
fields.add_field_method_set("width", |_, this, val| {
|
|
this.width = val;
|
|
Ok(())
|
|
});
|
|
}
|
|
|
|
fn add_methods<'lua, M: mlua::UserDataMethods<'lua, Self>>(methods: &mut M) {
|
|
methods.add_method("area", |_, this, ()| Ok(this.length * this.width));
|
|
methods.add_method("diagonal", |_, this, ()| {
|
|
Ok((this.length.pow(2) as f64 + this.width.pow(2) as f64).sqrt())
|
|
});
|
|
|
|
// Constructor
|
|
methods.add_meta_function(MetaMethod::Call, |_, ()| Ok(Rectangle::default()));
|
|
}
|
|
}
|
|
|
|
fn main() -> Result<()> {
|
|
let lua = Lua::new();
|
|
let rectangle = Rectangle::default();
|
|
lua.load(chunk! {
|
|
local rect = $rectangle()
|
|
rect.width = 10
|
|
rect.length = 5
|
|
assert(rect:area() == 50)
|
|
assert(rect:diagonal() - 11.1803 < 0.0001)
|
|
})
|
|
.exec()
|
|
}
|