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::>(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 = 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(()) }