diff options
| author | venomade <venomade@venomade.com> | 2026-05-21 20:34:45 +0100 |
|---|---|---|
| committer | venomade <venomade@venomade.com> | 2026-05-21 20:34:45 +0100 |
| commit | 637409d951e9dd1a2c29cd424bd41ff8c14b6d88 (patch) | |
| tree | 2d41be117f6a9f62562c7b54f06a1b1780c62a3b /rust_src | |
Initial Commit main
Diffstat (limited to 'rust_src')
| -rwxr-xr-x | rust_src/main.rs | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/rust_src/main.rs b/rust_src/main.rs new file mode 100755 index 0000000..b73b49f --- /dev/null +++ b/rust_src/main.rs @@ -0,0 +1,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(()) +} |
