From 58b305b9f6d13007d2ea62775054c95177f81092 Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Thu, 25 Jul 2024 00:40:37 +0200 Subject: first sketch --- src/lua/iobuffer.rs | 38 +++++++++++++++++++++++++ src/lua/mod.rs | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 src/lua/iobuffer.rs create mode 100644 src/lua/mod.rs (limited to 'src/lua') diff --git a/src/lua/iobuffer.rs b/src/lua/iobuffer.rs new file mode 100644 index 0000000..1150e0d --- /dev/null +++ b/src/lua/iobuffer.rs @@ -0,0 +1,38 @@ +use std::sync::RwLock; + +pub struct IoBuffer { + buffer: String, +} + +impl IoBuffer { + const fn new() -> Self { + Self { + buffer: String::new(), + } + } + + pub fn get(&self) -> String { + self.buffer.clone() + } + + pub fn write(&mut self, value: S) + where + S: AsRef + { + self.buffer += value.as_ref(); + } + + pub fn writeln(&mut self, value: S) + where + S: AsRef + { + self.buffer += value.as_ref(); + self.buffer += "\n"; + } +} + +static STDOUT_BUFFER: RwLock = RwLock::new(IoBuffer::new()); + +pub fn iobuffer() -> &'static RwLock { + &STDOUT_BUFFER +} diff --git a/src/lua/mod.rs b/src/lua/mod.rs new file mode 100644 index 0000000..5d45ee9 --- /dev/null +++ b/src/lua/mod.rs @@ -0,0 +1,80 @@ +use std::time::{SystemTime, UNIX_EPOCH}; + +use mlua::prelude::*; + +use crate::sheet::{cell::CellRef, register::Register}; + +pub mod iobuffer; + +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 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) +} + +#[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); + } +} -- cgit v1.2.3-70-g09d2