1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
use std::time::{SystemTime, UNIX_EPOCH};
use mlua::prelude::*;
use crate::sheet::{cell::CellRef, register::Register};
pub mod iobuffer;
fn print(_: &Lua, args: LuaMultiValue) -> LuaResult<()> {
let mut writer = iobuffer::iobuffer().write().unwrap();
for (i, arg) in args.iter().enumerate() {
if let Some(ud) = arg.as_userdata() {
if ud.is::<CellRef>() {
writer.write(ud.borrow::<CellRef>().unwrap().value().to_string());
} else {
writer.write(format!("{:#?}", ud));
}
} else {
writer.write(format!("{:#?}", arg));
}
if i < args.len() - 1 {
writer.write(", ");
}
}
writer.writeln("");
Ok(())
}
pub fn new_instance() -> LuaResult<Lua> {
let lua = Lua::new();
let print_binding = lua.create_function(print)?;
lua.globals().set("print", print_binding)?;
{
let math = lua.globals().get::<_, LuaTable>("math");
let randomseed = math.unwrap().get::<_, LuaFunction>("randomseed").unwrap();
let seed = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_millis();
randomseed.call::<_, ()>(seed).unwrap();
}
let neosheet = lua.create_table()?;
let register = Register;
neosheet.set("sheets", register)?;
lua.globals().set("neosheet", neosheet)?;
Ok(lua)
}
#[cfg(test)]
mod test {
use mlua::Function;
use super::new_instance;
#[test]
fn function_eval() {
let lua = new_instance().unwrap();
let func: Function = lua
.load(
r#"
function(a, b, c)
return a + b * c
end
"#,
)
.eval()
.unwrap();
eprintln!("{}", func.call::<_, String>((1, 2, 3, 4)).unwrap());
assert!(false);
}
}
|