about summary refs log tree commit diff
path: root/rust_src/main.rs
blob: b73b49f61e4f9d30dea1ea898424e55c890c005b (plain)
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(())
}