Sfoglia il codice sorgente

feat(core): support async functions in `mobile_entry_point` macro (#11162)

closes #11158
Amr Bashir 10 mesi fa
parent
commit
1d8b67b297
2 ha cambiato i file con 30 aggiunte e 3 eliminazioni
  1. 6 0
      .changes/mobile-async.md
  2. 24 3
      crates/tauri-macros/src/mobile.rs

+ 6 - 0
.changes/mobile-async.md

@@ -0,0 +1,6 @@
+---
+"tauri": "patch:feat"
+"tauri-macros": "patch:feat"
+---
+
+Support async functions for `mobile_entry_point` macro

+ 24 - 3
crates/tauri-macros/src/mobile.rs

@@ -29,12 +29,33 @@ fn get_env_var(name: &str, error: &mut Option<TokenStream2>, function: &ItemFn)
 
 pub fn entry_point(_attributes: TokenStream, item: TokenStream) -> TokenStream {
   let function = parse_macro_input!(item as ItemFn);
-  let function_name = &function.sig.ident;
+  let function_name = function.sig.ident.clone();
 
   let mut error = None;
   let domain = get_env_var("TAURI_ANDROID_PACKAGE_NAME_PREFIX", &mut error, &function);
   let app_name = get_env_var("TAURI_ANDROID_PACKAGE_NAME_APP_NAME", &mut error, &function);
 
+  let (wrapper, wrapper_name) = if function.sig.asyncness.is_some() {
+    let wrapper_name = syn::Ident::new(&format!("{function_name}_wrapper"), function_name.span());
+    (
+      quote! {
+        #function
+
+        fn #wrapper_name() {
+          ::tauri::async_runtime::block_on(#function_name());
+        }
+      },
+      wrapper_name,
+    )
+  } else {
+    (
+      quote! {
+        #function
+      },
+      function_name,
+    )
+  };
+
   if let Some(e) = error {
     quote!(#e).into()
   } else {
@@ -49,7 +70,7 @@ pub fn entry_point(_attributes: TokenStream, item: TokenStream) -> TokenStream {
         }
       }
 
-      #function
+      #wrapper
 
       fn _start_app() {
         #[cfg(target_os = "ios")]
@@ -58,7 +79,7 @@ pub fn entry_point(_attributes: TokenStream, item: TokenStream) -> TokenStream {
         {
           ::tauri::android_binding!(#domain, #app_name, _start_app, ::tauri::wry);
         }
-        stop_unwind(#function_name);
+        stop_unwind(#wrapper_name);
       }
 
       // be careful when renaming this, the `start_app` symbol is checked by the CLI