Clone in a terminal:
Commit 83d9905
Johan Mattsson - 2026-06-02T21:58:31+00:00
83d99058e5838785c83a4586a9f267d011581d1bjohan.mattsson.m@gmail.com

Support async functions

Changed files (1)

Diff

diff --git a/src/lib.rs b/src/lib.rsindex de508b3..135bae0 100644--- a/src/lib.rs+++ b/src/lib.rs@@ -38,7 +38,9 @@ pub fn callback(attr: TokenStream, item: TokenStream) -> TokenStream {      let register_fn_name = syn::Ident::new(&format!("{}_register", fn_name), fn_name.span());     let register_fn_name_lit = LitStr::new(&register_fn_name.to_string(), register_fn_name.span());-    let callback_closure = generate_callback_closure(&fn_name, input_fn.sig.inputs.clone());+    let is_async = input_fn.sig.asyncness.is_some();+    let callback_closure =+        generate_callback_closure(&fn_name, input_fn.sig.inputs.clone(), is_async);      let expanded = {         quote! {@@ -116,6 +118,7 @@ pub fn callback(attr: TokenStream, item: TokenStream) -> TokenStream { fn generate_callback_closure(     fn_name: &Ident,     inputs: syn::punctuated::Punctuated<FnArg, syn::token::Comma>,+    is_async: bool, ) -> proc_macro2::TokenStream {     use proc_macro2::Span;     use quote::quote;@@ -174,10 +177,22 @@ fn generate_callback_closure(         .map(|_| quote! { wasm_bindgen::JsValue })         .collect(); +    let call_block = if is_async {+        quote! {+            ::wasm_bindgen_futures::spawn_local(async move {+                #fn_name( #(#rs_arg_idents),* ).await;+            });+        }+    } else {+        quote! {+            #fn_name( #(#rs_arg_idents),* );+        }+    };+     let expanded = quote! {         let cb = Closure::wrap(Box::new(move | #( #js_arg_idents : #js_types ),* | {             #(#conversions)*-            #fn_name( #(#rs_arg_idents),* );+            #call_block         }) as Box<dyn FnMut( #(#js_types),* ) + 'static>);     }; 

Contact

Email: johan.mattsson.m@gmail.com
Mastodon: typo.social/@birdfont
GitHub: johanmattssonm
LinkedIn: johan-mattsson-2ab324112