From 6ca07d6af8a338e76817d06c6c6c6f13e64fba9c Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Fri, 26 Jul 2024 10:32:55 +0200 Subject: add neosheetrc support --- src/lua/mod.rs | 87 ++++++++++++++++++++++++------------------------------ src/lua/runtime.rs | 52 ++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 48 deletions(-) create mode 100644 src/lua/runtime.rs (limited to 'src/lua') diff --git a/src/lua/mod.rs b/src/lua/mod.rs index 5d45ee9..0ddcd7f 100644 --- a/src/lua/mod.rs +++ b/src/lua/mod.rs @@ -1,10 +1,34 @@ -use std::time::{SystemTime, UNIX_EPOCH}; +use std::{ + path::Path, + sync::{Mutex, MutexGuard}, +}; +use lazy_static::lazy_static; use mlua::prelude::*; -use crate::sheet::{cell::CellRef, register::Register}; +use crate::sheet::cell::CellRef; pub mod iobuffer; +pub mod runtime; + +lazy_static! { + static ref LUA: Mutex = { + let lock = Mutex::new(Lua::new()); + + { + let lua = lock.lock().unwrap(); + + let print_binding = lua.create_function(print).unwrap(); + lua.globals().set("print", print_binding).unwrap(); + + runtime::math(&lua).unwrap(); + runtime::neosheet(&lua).unwrap(); + runtime::package(&lua).unwrap(); + } + + lock + }; +} fn print(_: &Lua, args: LuaMultiValue) -> LuaResult<()> { let mut writer = iobuffer::iobuffer().write().unwrap(); @@ -28,53 +52,20 @@ fn print(_: &Lua, args: LuaMultiValue) -> LuaResult<()> { Ok(()) } -pub fn new_instance() -> LuaResult { - let lua = Lua::new(); - - let print_binding = lua.create_function(print)?; - lua.globals().set("print", print_binding)?; - - { - let math = lua.globals().get::<_, LuaTable>("math"); - let randomseed = math.unwrap().get::<_, LuaFunction>("randomseed").unwrap(); - - let seed = SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap() - .as_millis(); - randomseed.call::<_, ()>(seed).unwrap(); - } - - let neosheet = lua.create_table()?; - - let register = Register; - neosheet.set("sheets", register)?; - - lua.globals().set("neosheet", neosheet)?; - - Ok(lua) +pub fn get() -> MutexGuard<'static, Lua> { + LUA.lock().unwrap() } -#[cfg(test)] -mod test { - use mlua::Function; - - use super::new_instance; - - #[test] - fn function_eval() { - let lua = new_instance().unwrap(); - let func: Function = lua - .load( - r#" - function(a, b, c) - return a + b * c - end - "#, - ) - .eval() - .unwrap(); - eprintln!("{}", func.call::<_, String>((1, 2, 3, 4)).unwrap()); - assert!(false); +pub fn source(path: &str) -> LuaResult<()> { + let path = Path::new(path); + + if path.exists() && path.is_file() { + get().load(path).exec()?; + Ok(()) + } else { + Err(LuaError::runtime(format!( + "could not source {:?} (file not found)", + path + ))) } } diff --git a/src/lua/runtime.rs b/src/lua/runtime.rs new file mode 100644 index 0000000..dfb37e6 --- /dev/null +++ b/src/lua/runtime.rs @@ -0,0 +1,52 @@ +use mlua::{Function, Lua, Result, Table}; +use std::time::{SystemTime, UNIX_EPOCH}; + +use crate::{ + config::{self, GlobalConfig}, + sheet::register::Register, +}; + +pub fn neosheet(lua: &Lua) -> Result<()> { + let exports = lua.create_table()?; + + exports + .set("sheets", lua.create_proxy::()?) + .unwrap(); + exports + .set("config", lua.create_userdata(GlobalConfig::new())?) + .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", + path, + config::constants::USER_CONFIG_DIR.as_str(), + config::constants::USER_CONFIG_DIR.as_str() + ), + )?; + Ok(()) +} -- cgit v1.2.3-70-g09d2