summaryrefslogtreecommitdiff
path: root/src/lua
diff options
context:
space:
mode:
Diffstat (limited to 'src/lua')
-rw-r--r--src/lua/iobuffer.rs38
-rw-r--r--src/lua/mod.rs80
2 files changed, 118 insertions, 0 deletions
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<S>(&mut self, value: S)
+ where
+ S: AsRef<str>
+ {
+ self.buffer += value.as_ref();
+ }
+
+ pub fn writeln<S>(&mut self, value: S)
+ where
+ S: AsRef<str>
+ {
+ self.buffer += value.as_ref();
+ self.buffer += "\n";
+ }
+}
+
+static STDOUT_BUFFER: RwLock<IoBuffer> = RwLock::new(IoBuffer::new());
+
+pub fn iobuffer() -> &'static RwLock<IoBuffer> {
+ &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::<CellRef>() {
+ writer.write(ud.borrow::<CellRef>().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<Lua> {
+ 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);
+ }
+}