about summary refs log tree commit diff
path: root/rust_src/main.rs
diff options
context:
space:
mode:
authorvenomade <venomade@venomade.com>2026-05-21 20:34:45 +0100
committervenomade <venomade@venomade.com>2026-05-21 20:34:45 +0100
commit637409d951e9dd1a2c29cd424bd41ff8c14b6d88 (patch)
tree2d41be117f6a9f62562c7b54f06a1b1780c62a3b /rust_src/main.rs
Initial Commit main
Diffstat (limited to 'rust_src/main.rs')
-rwxr-xr-xrust_src/main.rs65
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(())
+}