use mlua::{Function, Lua, Result, Table}; use std::time::{SystemTime, UNIX_EPOCH}; use crate::{ config::{self, GlobalConfig}, sheet::{loader::Loader, register::Register}, state::GlobalState, }; pub fn neosheet(lua: &Lua) -> Result<()> { let exports = lua.create_table()?; exports .set("sheet", lua.create_userdata(Register)?) .unwrap(); exports .set("config", lua.create_userdata(GlobalConfig::default())?) .unwrap(); exports .set("state", lua.create_userdata(GlobalState::default())?) .unwrap(); exports .set("loader", lua.create_proxy::()?) .unwrap(); lua.globals() .get::<_, Table>("package")? .get::<_, Table>("loaded")? .set("neosheet", exports)?; Ok(()) } pub fn math(lua: &Lua) -> Result<()> { let math = lua.globals().get::<_, Table>("math"); let randomseed = math.unwrap().get::<_, Function>("randomseed").unwrap(); let seed = SystemTime::now() .duration_since(UNIX_EPOCH) .unwrap() .as_millis(); randomseed.call::<_, ()>(seed).unwrap(); Ok(()) } pub fn package(lua: &Lua) -> Result<()> { let package = lua.globals().get::<_, Table>("package")?; let path = package.get::<_, String>("path")?; package.set( "path", format!( "{}/?.lua;{}/?/init.lua;{}/lib/?.lua;{}/lib/?/init.lua;{};./?.lua", config::constants::USER_CONFIG_DIR.as_str(), config::constants::USER_CONFIG_DIR.as_str(), config::constants::USER_CONFIG_DIR.as_str(), config::constants::USER_CONFIG_DIR.as_str(), path.split(';') .filter(|s| s.starts_with('/')) .collect::>() .join(";"), ), )?; Ok(()) }