1#[macro_export]
32macro_rules! make_lua_fn {
33 ($lua_inst:ident, $to_call: ident, $(
34 ($argname: ident, $argtype: ty))
35 ,
36 *
37 ) => {
38 let tmp = $lua_inst
39 .create_function(|_, ($($argname,)*): ($($argtype,)*)| {
40 Ok($to_call($($argname,)*))
41 })
42 .unwrap();
43 $lua_inst.globals().set(stringify!($to_call), tmp).unwrap();
44 };
45
46 ($lua_inst:ident, $to_call: ident) => {
47 let tmp = $lua_inst
48 .create_function(move |_, ()| Ok($to_call()))
49 .unwrap();
50 $lua_inst.globals().set(stringify!($to_call), tmp).unwrap();
51 };
52}
53
54#[cfg(test)]
55mod tests {
56 use rlua::Lua;
57 #[test]
58 fn test_functions() {
59 let lua = setup_lua();
60 let lua_str = r#"
61 print_hello()
62 print(get_random_number())
63 print_arg(14)
64 print_multi_args(14, 4.4)
65 "#;
66 lua.eval::<_, ()>(lua_str, None).unwrap();
67 }
68
69 fn setup_lua() -> crate::Lua {
70 let lua_inst = crate::Lua::new();
71 make_lua_fn!(lua_inst, print_hello);
72 make_lua_fn!(lua_inst, get_random_number);
73 make_lua_fn!(lua_inst, print_arg, (arg, u32));
74 make_lua_fn!(lua_inst, print_multi_args, (arg, u32), (arg2, f32));
75 lua_inst
76 }
77
78 fn print_hello() {
79 println!("Hello from Rust");
80 }
81
82 fn get_random_number() -> u32 {
83 println!("Returning 4");
84 4
85 }
86
87 fn print_arg(data: u32) {
88 println!("Got single arg {}", data);
89 }
90
91 fn print_multi_args(data: u32, data2: f32) {
92 println!("Got multiple args {} and {}", data, data2);
93 }
94
95}