neige_lua/libs/
mod.rs

1mod pairs;
2
3use crate::{
4    api::{LuaApi, PushApi},
5    state::LuaState,
6};
7
8fn lua_type(ls: &mut dyn LuaApi) -> usize {
9    let tp = ls.ty_id(1);
10    let ty_name = ls.tp_name(tp);
11    ls.push_string(&ty_name);
12    1
13}
14
15fn pcall(ls: &mut dyn LuaApi) -> usize {
16    let n_args = ls.get_top() - 1;
17    let status = ls.pcall(n_args, -1, 0);
18    ls.push_boolean(status == 0);
19    ls.insert(1);
20    ls.get_top() as usize
21}
22
23fn error(ls: &mut dyn LuaApi) -> usize {
24    ls.error() as usize
25}
26
27fn get_meta_table(ls: &mut dyn LuaApi) -> usize {
28    if !ls.get_meta_table(1) {
29        ls.push_nil();
30    }
31    1
32}
33
34fn set_meta_table(ls: &mut dyn LuaApi) -> usize {
35    ls.set_meta_table(1);
36    1
37}
38
39fn lua_print(ls: &mut dyn LuaApi) -> usize {
40    let n_args = ls.get_top();
41    for i in 1..=n_args {
42        if ls.is_boolean(i) {
43            print!("{}", ls.to_boolean(i))
44        } else if ls.is_string(i) {
45            print!("{}", ls.to_string(i))
46        } else {
47            print!("{}", ls.tp_name(ls.ty_id(i)));
48        }
49        if i < n_args {
50            print!("\t")
51        }
52    }
53    println!();
54    0
55}
56
57impl LuaState {
58    pub fn aux_lib(&mut self) {
59        self.register("type", lua_type);
60        self.register("print", lua_print);
61        self.register("getmetatable", get_meta_table);
62        self.register("setmetatable", set_meta_table);
63        self.register("next", pairs::next);
64        self.register("pairs", pairs::pairs);
65        self.register("ipairs", pairs::ipairs);
66        self.register("error", error);
67        self.register("pcall", pcall);
68        self.register("print", lua_print);
69    }
70}