lua/
lua.rs

1use std::env;
2use std::ffi::{CStr, CString};
3use std::ptr;
4
5use luajit2_sys as sys;
6
7unsafe fn run_script(script_name: String, script_src: String) {
8    let lua = sys::luaL_newstate();
9    assert_ne!(lua, ptr::null_mut());
10    sys::luaL_openlibs(lua);
11    let script_data = script_src.as_bytes();
12    let script_name = CString::new(script_name).unwrap();
13    let mut error = sys::luaL_loadbuffer(
14        lua,
15        script_data.as_ptr() as _,
16        script_data.len() as _,
17        script_name.as_ptr() as _,
18    );
19    if error != 0 {
20        eprintln!("luaL_loadbuffer failed");
21    } else {
22        error = sys::lua_pcall(lua, 0, 1, 0);
23        if error != 0 {
24            eprintln!("lua_pcall failed");
25        }
26    }
27    let idx = sys::lua_gettop(lua);
28    if sys::lua_isnoneornil(lua, idx) != 1 {
29        let s = sys::lua_tostring(lua, idx);
30        assert_ne!(s, ptr::null(), "lua_tostring returned null");
31        let result = CStr::from_ptr(s).to_string_lossy().to_string();
32        println!("script result: {}", result);
33    }
34    sys::lua_close(lua);
35}
36
37fn main() {
38    if let Some(script_name) = env::args().skip(1).next() {
39        let script_src = std::fs::read_to_string(&script_name)
40            .unwrap_or_else(|e| panic!("failed to read file: '{}' {:?}", &script_name, e));
41        unsafe {
42            run_script(script_name, script_src);
43        }
44    } else {
45        println!(
46            "{} FILE",
47            env::current_exe()
48                .unwrap()
49                .file_name()
50                .unwrap()
51                .to_string_lossy()
52        );
53    }
54}