From 8c175e22f50909f812e17371ca2f922ab6d7d1d2 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Wed, 21 May 2025 13:57:27 +0300 Subject: [PATCH] view: ErrorBoundary --- crates/app/src/view.rs | 47 +++++++++++++++++++----------------------- deps/tengri | 2 +- 2 files changed, 22 insertions(+), 27 deletions(-) diff --git a/crates/app/src/view.rs b/crates/app/src/view.rs index 7bb4a806..e059a3ec 100644 --- a/crates/app/src/view.rs +++ b/crates/app/src/view.rs @@ -2,37 +2,32 @@ use crate::*; pub(crate) use std::fmt::Write; pub(crate) use ::tengri::tui::ratatui::prelude::Position; -impl App { - pub fn view (&self) -> impl Content + '_ { - let view: Perhaps>> = - Namespace::take_from(self, &mut self.config.view.clone()); - Either(view.is_ok(), - ThunkRender::new(move|to|if let Some(view) = view.as_ref().unwrap().as_ref() { - Content::render(view, to) - }), - "error?!") - //Fill::xy(self.size.of(col! { - //Tui::bg(Rgb(72,72,0), When(matches!(&view, Err(_)), Bsp::s( - //Fixed::y(1, "view error"), - //Bsp::s( - //view.as_ref().err().map(|e|format!("{e}")), - //format!("{}", &self.config.view.0.0))))), - //When(matches!(&view, Ok(None)), Bsp::s( - //Tui::bg(Rgb(96,48,0), - //Fixed::y(1, Fill::x(Align::w("no view returned, as defined by:")))), - //Tui::bg(Rgb(72,32,0), - //Fill::x(Stack::south(|add: &mut dyn FnMut(&dyn Render)|{ - //for line in self.config.view.0.0.split('\n') { - //add(&Fill::x(Align::w(line))); - //} - //}))))), - //When(matches!(&view, Ok(Some(_))), &view.unwrap().unwrap()), - //})) +// Thunks can be natural error boundaries! +struct ErrorBoundary>(std::marker::PhantomData, Perhaps); +impl> Content for ErrorBoundary { + fn content (&self) -> impl Render + '_ { + ThunkRender::new(|to|match self.1.as_ref() { + Ok(Some(content)) => content.render(to), + Ok(None) => to.blit(&"empty?", 0, 0, Some(Style::default().yellow())), + Err(e) => Content::render(&Tui::fg_bg( + Rgb(255,224,244), + Rgb(96,24,24), + Bsp::s( + Bsp::e(Tui::bold(true, "oops. "), "rendering failed."), + Bsp::e("\"why?\" ", Tui::bold(true, &format!("{e}"))), + )), to) + }) } } #[tengri_proc::view(TuiOut)] impl App { + pub fn view (app: &Self) -> impl Content { + ErrorBoundary:: + '_>>( + Default::default(), + Namespace::take_from(app, &mut app.config.view.clone()) + ) + } pub fn view_nil (app: &Self) -> impl Content { "nil" } diff --git a/deps/tengri b/deps/tengri index 776cea6f..75165170 160000 --- a/deps/tengri +++ b/deps/tengri @@ -1 +1 @@ -Subproject commit 776cea6f1ba502b87bcaed3a7d794076e328df2e +Subproject commit 7516517078d71183cfa4c409aa8a6948675ebe7a