From 62d672fc90750dc785b1750a158ad28675510d7d Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Tue, 22 Nov 2022 23:30:44 -0800 Subject: [PATCH] wip: play with error code --- packages/core/src/lib.rs | 2 +- packages/core/tests/bubble_error.rs | 69 +++++++++++++++++++ .../{fragments.rs => create_fragments.rs} | 0 .../core/tests/{lists.rs => create_lists.rs} | 23 +++++++ .../tests/{passthru.rs => create_passthru.rs} | 0 5 files changed, 93 insertions(+), 1 deletion(-) rename packages/core/tests/{fragments.rs => create_fragments.rs} (100%) rename packages/core/tests/{lists.rs => create_lists.rs} (58%) rename packages/core/tests/{passthru.rs => create_passthru.rs} (100%) diff --git a/packages/core/src/lib.rs b/packages/core/src/lib.rs index d402b4e53..d88e73986 100644 --- a/packages/core/src/lib.rs +++ b/packages/core/src/lib.rs @@ -34,7 +34,7 @@ pub(crate) mod innerlude { /// An [`Element`] is a possibly-errored [`VNode`] created by calling `render` on [`Scope`] or [`ScopeState`]. /// /// An Errored [`Element`] will propagate the error to the nearest error boundary. - pub type Element<'a> = anyhow::Result>; + pub type Element<'a> = Result, anyhow::Error>; /// A [`Component`] is a function that takes a [`Scope`] and returns an [`Element`]. /// diff --git a/packages/core/tests/bubble_error.rs b/packages/core/tests/bubble_error.rs index 8b1378917..6da62b995 100644 --- a/packages/core/tests/bubble_error.rs +++ b/packages/core/tests/bubble_error.rs @@ -1 +1,70 @@ +//! we should properly bubble up errors from components +use std::{error::Error as StdError, marker::PhantomData, string::ParseError}; + +use anyhow::{anyhow, bail}; +use dioxus::prelude::*; + +// todo: add these to dioxus +pub trait Reject: Sized { + fn reject_err(self, t: impl FnOnce(E) -> anyhow::Error) -> Result { + todo!() + } + fn reject_because(self, t: impl Into) -> Result { + todo!() + } + + fn reject(self) -> Result { + todo!() + } +} + +impl Reject for &Result { + fn reject_err(self, t: impl FnOnce(E) -> anyhow::Error) -> Result { + todo!() + } +} + +fn use_query_param<'a>(cx: &'a ScopeState) -> Result<&'a i32, ParseError> { + todo!() +} + +/// Call "clone" on the underlying error so it can be propogated out +pub trait CloneErr { + fn clone_err(&self) -> Result<&T, E::Owned> + where + Self: Sized; +} + +impl CloneErr for Result { + fn clone_err(&self) -> Result<&T, E::Owned> + where + Self: Sized, + { + match self { + Ok(s) => Ok(s), + Err(e) => Err(e.to_owned()), + } + } +} + +fn app(cx: Scope) -> Element { + // propgates error upwards, does not give a reason, lets Dioxus figure it out + let value = cx.use_hook(|| "123123123.123".parse::()).reject()?; + + // propgates error upwards, gives a reason + let value = cx + .use_hook(|| "123123123.123".parse::()) + .reject_because("Parsing float failed")?; + + let value = cx.use_hook(|| "123123123.123".parse::()).clone_err()?; + + let t = use_query_param(cx)?; + + let value = cx + .use_hook(|| "123123123.123".parse::()) + .as_ref() + .map_err(|_| anyhow!("Parsing float failed"))?; + + todo!() +} diff --git a/packages/core/tests/fragments.rs b/packages/core/tests/create_fragments.rs similarity index 100% rename from packages/core/tests/fragments.rs rename to packages/core/tests/create_fragments.rs diff --git a/packages/core/tests/lists.rs b/packages/core/tests/create_lists.rs similarity index 58% rename from packages/core/tests/lists.rs rename to packages/core/tests/create_lists.rs index d7a22c515..2c9f3ad4c 100644 --- a/packages/core/tests/lists.rs +++ b/packages/core/tests/create_lists.rs @@ -25,6 +25,29 @@ fn list_renders() { let edits = dom.rebuild().santize(); + assert_eq!( + edits.template_mutations, + [ + // Create the outer div + CreateElement { name: "div", namespace: None, id: ElementId(1) }, + // todo: since this is the only child, we should just use + // append when modify the values (IE no need for a placeholder) + CreatePlaceholder { id: ElementId(2) }, + AppendChildren { m: 1 }, + SaveTemplate { name: "template", m: 1 }, + // Create the inner template div + CreateElement { name: "div", namespace: None, id: ElementId(3) }, + CreateElement { name: "h1", namespace: None, id: ElementId(4) }, + CreateStaticText { value: "hello world! " }, + AppendChildren { m: 1 }, + CreateElement { name: "p", namespace: None, id: ElementId(5) }, + CreateStaticText { value: "d" }, + AppendChildren { m: 1 }, + AppendChildren { m: 2 }, + SaveTemplate { name: "template", m: 1 } + ] + ); + assert_eq!( edits.edits, [ diff --git a/packages/core/tests/passthru.rs b/packages/core/tests/create_passthru.rs similarity index 100% rename from packages/core/tests/passthru.rs rename to packages/core/tests/create_passthru.rs