diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-12-07 17:17:22 +0100 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-12-07 17:17:22 +0100 |
| commit | c0598823335cfdc6deb5c48fe1ead8ecea18097e (patch) | |
| tree | 561b47f9f459b9633c4244c3a0cabe12a44859c1 /src | |
| parent | 53a9172bddbb83a1c570cc3fed794e7b73c1f1d7 (diff) | |
add error type to iobuffer
Diffstat (limited to 'src')
| -rw-r--r-- | src/app.rs | 4 | ||||
| -rw-r--r-- | src/lua/iobuffer.rs | 25 | ||||
| -rw-r--r-- | src/lua/mod.rs | 19 | ||||
| -rw-r--r-- | src/state/editor/mod.rs | 5 | ||||
| -rw-r--r-- | src/widgets/logview.rs | 40 | ||||
| -rw-r--r-- | src/widgets/sheetview/mod.rs | 6 |
6 files changed, 65 insertions, 34 deletions
@@ -113,14 +113,14 @@ impl App { let mut log = None; if state.log.visible { - let layout = Layout::vertical([Constraint::Min(1), Constraint::Length(15)]).split(view); + let layout = Layout::vertical([Constraint::Min(1), Constraint::Max(15)]).split(view); view = layout[0]; log = Some(layout[1]); } if state.editor.visible { let layout = - Layout::horizontal([Constraint::Min(1), Constraint::Length(80)]).split(view); + Layout::horizontal([Constraint::Min(1), Constraint::Max(80)]).split(view); view = layout[0]; editor = Some(layout[1]); } 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(()) } diff --git a/src/state/editor/mod.rs b/src/state/editor/mod.rs index 3e9d9e0..25765cc 100644 --- a/src/state/editor/mod.rs +++ b/src/state/editor/mod.rs @@ -4,6 +4,7 @@ use self::{bar::EditorBarState, buffer::Buffer, cursorshape::CursorShape}; use super::{window::Window, GlobalState, DUMMY_STATE}; use mlua::{Lua, UserData}; +use crate::lua::iobuffer; pub mod bar; pub mod buffer; @@ -35,8 +36,8 @@ impl EditorState { pub fn run(lua: &Lua) { let script = { cfg!().buffer.as_string() }; - if let Err(_error) = lua.load(script).exec() { - // TODO: add error handling + if let Err(error) = lua.load(script).exec() { + iobuffer::iobuffer().write().unwrap().error(error); } } } diff --git a/src/widgets/logview.rs b/src/widgets/logview.rs index 4b80d7c..df2ebce 100644 --- a/src/widgets/logview.rs +++ b/src/widgets/logview.rs @@ -1,6 +1,8 @@ -use ratatui::{crossterm::event::KeyEvent, text::ToSpan, widgets::Widget}; +use ratatui::{crossterm::event::KeyEvent, style::{Color, Style}, text::ToSpan, widgets::{Widget, Paragraph}}; -use crate::lua::iobuffer::iobuffer; +use crate::lua::iobuffer::{iobuffer, BufferChunk}; +use crate::config::GlobalConfig; +use crate::lua; use super::statusbar::StatusBar; @@ -24,10 +26,12 @@ impl Widget for &mut LogView { where Self: Sized, { + let theme = GlobalConfig::get().theme.view.clone(); + self.bar.render(area, buf); let inner_area = self.bar.area(area); - let lines = { + let chunks = { let buffer = iobuffer().read().unwrap(); buffer.get() }; @@ -36,15 +40,33 @@ impl Widget for &mut LogView { line_area.height = 1; line_area.y = inner_area.y + inner_area.height - 1; - for line in lines.lines().rev() { - let line = line.to_span(); - line.render(line_area, buf); - - line_area.y -= 1; + theme + .background + .get((), lua::get()) + .unwrap_or_default() + .apply(Paragraph::default()) + .render(inner_area, buf); - if !inner_area.contains(line_area.into()) { + for chunk in chunks.into_iter().rev() { + if line_area.y < inner_area.y { break; } + + let (lines, color) = match chunk { + BufferChunk::StdOut(s) => (s, Color::White), + BufferChunk::StdErr(s) => (s, Color::Red), + }; + + for line in lines.lines().rev() { + if line_area.y < inner_area.y { + break; + } + + let line = line.to_span().style(Style::default().fg(color)); + line.render(line_area, buf); + + line_area.y -= 1; + } } } } diff --git a/src/widgets/sheetview/mod.rs b/src/widgets/sheetview/mod.rs index 0c5b3d5..32bf138 100644 --- a/src/widgets/sheetview/mod.rs +++ b/src/widgets/sheetview/mod.rs @@ -7,7 +7,7 @@ use ratatui::{ use crate::{ config::{keymap::ViewKeyMap, theme::view::bar::SheetViewBarTheme, GlobalConfig}, - lua, + lua::{self, iobuffer}, state::{ view::{bar::SheetViewBarState, mode::Mode}, GlobalState, @@ -37,8 +37,8 @@ impl SheetView { match mode { Mode::Command => match event.code { KeyCode::Enter => { - if let Err(_error) = lua::get().load(self.bar.input().unwrap_or("")).exec() { - // TODO: push errors to buffer + if let Err(error) = lua::get().load(self.bar.input().unwrap_or("")).exec() { + iobuffer::iobuffer().write().unwrap().error(error); } GlobalState::get().view.cancel_mode(); |