summaryrefslogtreecommitdiff
path: root/src/lua
diff options
context:
space:
mode:
Diffstat (limited to 'src/lua')
-rw-r--r--src/lua/iobuffer.rs25
-rw-r--r--src/lua/mod.rs19
2 files changed, 26 insertions, 18 deletions
diff --git a/src/lua/iobuffer.rs b/src/lua/iobuffer.rs
index 1150e0d..baab111 100644
--- a/src/lua/iobuffer.rs
+++ b/src/lua/iobuffer.rs
@@ -1,33 +1,38 @@
use std::sync::RwLock;
+#[derive(Clone)]
+pub enum BufferChunk {
+ StdOut(String),
+ StdErr(String),
+}
+
pub struct IoBuffer {
- buffer: String,
+ buffer: Vec<BufferChunk>,
}
impl IoBuffer {
const fn new() -> Self {
Self {
- buffer: String::new(),
+ buffer: Vec::new(),
}
}
- pub fn get(&self) -> String {
+ pub fn get(&self) -> Vec<BufferChunk> {
self.buffer.clone()
}
- pub fn write<S>(&mut self, value: S)
+ pub fn print<S>(&mut self, value: S)
where
- S: AsRef<str>
+ S: std::string::ToString
{
- self.buffer += value.as_ref();
+ self.buffer.push(BufferChunk::StdOut(value.to_string()))
}
- pub fn writeln<S>(&mut self, value: S)
+ pub fn error<S>(&mut self, value: S)
where
- S: AsRef<str>
+ S: std::string::ToString
{
- self.buffer += value.as_ref();
- self.buffer += "\n";
+ self.buffer.push(BufferChunk::StdErr(value.to_string()))
}
}
diff --git a/src/lua/mod.rs b/src/lua/mod.rs
index ae619b0..815b38d 100644
--- a/src/lua/mod.rs
+++ b/src/lua/mod.rs
@@ -18,24 +18,25 @@ pub mod runnable;
pub mod runtime;
macro_rules! ud_is_type {
- ($writer:ident, $ud:ident, $f:ty => $fe:expr $(, $($r:ty => $e:expr),+)? $(,)?) => {
+ ($content:ident, $ud:ident, $f:ty => $fe:expr $(, $($r:ty => $e:expr),+)? $(,)?) => {
if $ud.is::<$f>() {
- $writer.write(format!("{:#?}", $fe))
+ $content += &format!("{:#?}", $fe);
} $($( else if $ud.is::<$r>() {
- $writer.write(format!("{:#?}", $e))
+ $content += &format!("{:#?}", $e);
})*)? else {
- $writer.write(format!("{:#?}", $ud));
+ $content += &format!("{:#?}", $ud);
}
};
}
fn print(_: &Lua, args: LuaMultiValue) -> LuaResult<()> {
let mut writer = iobuffer::iobuffer().write().unwrap();
+ let mut content = String::new();
for (i, arg) in args.iter().enumerate() {
if let Some(ud) = arg.as_userdata() {
ud_is_type!(
- writer,
+ content,
ud,
CellRef => ud.borrow::<CellRef>(),
GlobalConfig => GlobalConfig::get(),
@@ -45,14 +46,16 @@ fn print(_: &Lua, args: LuaMultiValue) -> LuaResult<()> {
SheetViewState => GlobalState::get().view,
);
} else {
- writer.write(format!("{:#?}", arg));
+ content += &format!("{:#?}", arg);
}
if i < args.len() - 1 {
- writer.write(", ");
+ content += ", ";
}
}
- writer.writeln("");
+ content += "\n";
+
+ writer.print(content);
Ok(())
}