diff options
Diffstat (limited to 'src/lua')
| -rw-r--r-- | src/lua/iobuffer.rs | 25 | ||||
| -rw-r--r-- | src/lua/mod.rs | 19 |
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(()) } |