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
|
use std::{arch, fs::read_to_string};
use mlua::prelude::*;
const SILD_VERSION: &str = env!("CARGO_PKG_VERSION");
const MAIN_LUA: &str = include_str!("../lua_src/main.lua");
include!(concat!(env!("OUT_DIR"), "/bundled_modules.rs"));
fn main() -> LuaResult<()> {
let lua = unsafe { Lua::unsafe_new() };
{
let package: LuaTable = lua.globals().get("package")?;
let searchers: LuaTable = package.get("searchers")?;
let registry = lua.create_table()?;
for (name, src) in BUNDLED_MODULES {
registry.set(*name, *src)?;
}
let searcher = lua.create_function(move |lua, module_name: String| {
match registry.get::<Option<String>>(module_name.as_str())? {
Some(src) => {
let loader = lua
.load(&src)
.set_name(format!("@{module_name}"))
.into_function()?;
Ok(LuaMultiValue::from_vec(vec![LuaValue::Function(loader)]))
}
None => Ok(LuaMultiValue::from_vec(vec![LuaValue::String(
lua.create_string(format!("\n\tMLUA: no bundled module '{module_name}'"))?,
)])),
}
})?;
let len = searchers.raw_len();
for i in (2..=len).rev() {
let v: LuaValue = searchers.get(i)?;
searchers.set(i + 1, v)?;
}
// Setting in position 2 gives priority over filesystem search
searchers.set(2, searcher)?;
}
{
let args: Vec<String> = std::env::args().collect();
let binary = args.first().map(|s| s.as_str()).unwrap_or("");
let arg_table = lua.create_table()?;
arg_table.raw_set(-1i32, binary)?;
arg_table.raw_set(0i32, binary)?;
for (i, val) in args.iter().skip(1).enumerate() {
arg_table.raw_set((i + 1) as i32, val.as_str())?;
}
lua.globals().set("arg", arg_table)?;
}
lua.globals().set("SILD_VERSION", SILD_VERSION)?;
lua.load(MAIN_LUA).set_name("@main.lua").exec()?;
Ok(())
}
|