summary refs log tree commit diff stats
path: root/src/components/async_fetch.rs
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2025-10-23 01:36:39 +0200
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2025-10-23 01:36:39 +0200
commit7bff22756beec82b4a1470e2d325b706dc56e5f2 (patch)
tree1566965125cfd5fbd73d654e9ee6ca8256301411 /src/components/async_fetch.rs
parentfeat(form): Re-write the form macro as a proc macro (diff)
downloadweb-client-7bff22756beec82b4a1470e2d325b706dc56e5f2.zip
feat(buy): Provide basic buy interface
Diffstat (limited to 'src/components/async_fetch.rs')
-rw-r--r--src/components/async_fetch.rs67
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>
-//     }
-// }