diff options
| author | Benedikt Peetz <benedikt.peetz@b-peetz.de> | 2025-10-23 01:36:39 +0200 |
|---|---|---|
| committer | Benedikt Peetz <benedikt.peetz@b-peetz.de> | 2025-10-23 01:36:39 +0200 |
| commit | 7bff22756beec82b4a1470e2d325b706dc56e5f2 (patch) | |
| tree | 1566965125cfd5fbd73d654e9ee6ca8256301411 /src/components/async_fetch.rs | |
| parent | feat(form): Re-write the form macro as a proc macro (diff) | |
| download | web-client-7bff22756beec82b4a1470e2d325b706dc56e5f2.zip | |
feat(buy): Provide basic buy interface
Diffstat (limited to '')
| -rw-r--r-- | src/components/async_fetch.rs | 67 |
1 files changed, 38 insertions, 29 deletions
diff --git a/src/components/async_fetch.rs b/src/components/async_fetch.rs index 7105c6f..f24e3a5 100644 --- a/src/components/async_fetch.rs +++ b/src/components/async_fetch.rs @@ -1,5 +1,23 @@ +macro_rules! AsyncResource { + ( + ( + $( + $input_name:ident : $input_type:ty = $input:expr + ),* + ) -> $output:ty $fetcher:block + ) => {{ + async fn fetcher($($input_name : $input_type),*) -> $output $fetcher + + leptos::prelude::LocalResource::new(move || fetcher($($input),*)) + }} +} +pub(crate) use AsyncResource; + macro_rules! AsyncFetch { - (fetcher = $fetcher:block producer = |$bound_variable:pat_param| $producer:block) => {{ + ( + fetcher = $fetcher:block + producer = |$bound_variable:pat_param| $producer:block + ) => {{ use leptos::{ prelude::{ElementChild, LocalResource, Suspend, Transition}, view, @@ -18,33 +36,24 @@ macro_rules! AsyncFetch { </Transition> } }}; + ( + @map_error_in_producer + from_resource = $resource:ident + producer = |$bound_variable:pat_param| $producer:block + ) => {{ + use leptos::prelude::{ElementChild, Suspend, Transition}; + + leptos::view! { + <Transition fallback=|| { + view! { <p>"Loading..."</p> } + }> + {move || Suspend::new(async move { + $resource + .await + .map(|$bound_variable| $producer) + })} + </Transition> + } + }}; } pub(crate) use AsyncFetch; - -// #[component] -// pub fn AsyncFetch<P, V, T, Fut>( -// fetcher: impl Fn() -> Fut + 'static + Send + Sync, -// producer: P, -// ) -> impl IntoView -// where -// V: IntoView + 'static, -// P: Fn(T) -> V + 'static + Send + Sync, -// Fut: Future<Output = Result<T, Error>> + 'static, -// T: 'static, -// LocalResource<Result<T, Error>>: IntoFuture<Output = Result<T, Error>> + Send, -// { -// view! { -// <Transition fallback=|| { -// view! { <p>"Loading..."</p> } -// }> -// { || Suspend::new(async { -// let value_resource = LocalResource::new( || fetcher()); -// value_resource -// .await -// .map(|value| { -// producer(value) -// }) -// })} -// </Transition> -// } -// } |
