summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2024-12-07 17:17:22 +0100
committerNathan Reiner <nathan@nathanreiner.xyz>2024-12-07 17:17:22 +0100
commitc0598823335cfdc6deb5c48fe1ead8ecea18097e (patch)
tree561b47f9f459b9633c4244c3a0cabe12a44859c1 /src
parent53a9172bddbb83a1c570cc3fed794e7b73c1f1d7 (diff)
add error type to iobuffer
Diffstat (limited to 'src')
-rw-r--r--src/app.rs4
-rw-r--r--src/lua/iobuffer.rs25
-rw-r--r--src/lua/mod.rs19
-rw-r--r--src/state/editor/mod.rs5
-rw-r--r--src/widgets/logview.rs40
-rw-r--r--src/widgets/sheetview/mod.rs6
6 files changed, 65 insertions, 34 deletions
diff --git a/src/app.rs b/src/app.rs
index 5037a8c..356da0a 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -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();