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}