feat: implement ID cycling

This commit is contained in:
Jonathan Kelley committed 2022-11-24 09:11:27 -05:00
1 parent 0cfbfc88e2
commit 5713e13ff2
10 files changed
+213 -145

No files matched your search

+19 -58
View File
@@ -1,69 +1,30 @@
//! 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<E: Clone>: Sized {
fn reject_err(self, t: impl FnOnce(E) -> anyhow::Error) -> Result<Self, anyhow::Error> {
todo!()
}
fn reject_because(self, t: impl Into<String>) -> Result<Self, anyhow::Error> {
todo!()
}
fn reject(self) -> Result<Self, anyhow::Error> {
todo!()
}
}
impl<T, E: Clone> Reject<E> for &Result<T, E> {
fn reject_err(self, t: impl FnOnce(E) -> anyhow::Error) -> Result<Self, anyhow::Error> {
todo!()
}
}
/// Call "clone" on the underlying error so it can be propogated out
pub trait CloneErr<T, E: ToOwned> {
fn clone_err(&self) -> Result<&T, E::Owned>
where
Self: Sized;
}
impl<E: ToOwned, T> CloneErr<T, E> for Result<T, E> {
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::<f32>()).reject()?;
let raw = match cx.generation() % 2 {
0 => "123.123",
1 => "123.123.123",
_ => unreachable!(),
};
// propgates error upwards, gives a reason
let value = cx
.use_hook(|| "123123123.123".parse::<f32>())
.reject_because("Parsing float failed")?;
let value = raw.parse::<f32>()?;
let value = cx.use_hook(|| "123123123.123".parse::<f32>()).clone_err()?;
cx.render(rsx! {
div { "hello {value}" }
})
}
let value = cx
.use_hook(|| "123123123.123".parse::<f32>())
.as_ref()
.map_err(Clone::clone)?;
#[test]
fn it_goes() {
let mut dom = VirtualDom::new(app);
let value = cx
.use_hook(|| "123123123.123".parse::<f32>())
.as_ref()
.map_err(|_| anyhow!("Parsing float failed"))?;
let edits = dom.rebuild().santize();
todo!()
dbg!(edits);
dom.mark_dirty_scope(ScopeId(0));
dom.render_immediate();
}