use std::{ path::Path, sync::{Mutex, MutexGuard}, }; use lazy_static::lazy_static; use mlua::prelude::*; 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(); for (i, arg) in args.iter().enumerate() { if let Some(ud) = arg.as_userdata() { if ud.is::() { writer.write(ud.borrow::().unwrap().value().to_string()); } else { writer.write(format!("{:#?}", ud)); } } else { writer.write(format!("{:#?}", arg)); } if i < args.len() - 1 { writer.write(", "); } } writer.writeln(""); Ok(()) } pub fn get() -> MutexGuard<'static, Lua> { LUA.lock().unwrap() } 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 ))) } }