summaryrefslogtreecommitdiff
path: root/src/lua/mod.rs
blob: 5d45ee9f7e6fe6391cbbe6ab71a5550fe886f3de (plain)
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);
    }
}