mobile.rs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. use proc_macro::TokenStream;
  2. use proc_macro2::TokenStream as TokenStream2;
  3. use quote::{format_ident, quote};
  4. use std::env::var;
  5. use syn::{parse_macro_input, spanned::Spanned, ItemFn};
  6. fn get_env_var<R: FnOnce(String) -> String>(
  7. name: &str,
  8. replacer: R,
  9. error: &mut Option<TokenStream2>,
  10. function: &ItemFn,
  11. ) -> TokenStream2 {
  12. match var(name) {
  13. Ok(value) => {
  14. let ident = format_ident!("{}", replacer(value));
  15. quote!(#ident)
  16. }
  17. Err(_) => {
  18. error.replace(
  19. syn::Error::new(
  20. function.span(),
  21. format!("`{name}` env var not set, do you have a build script with tauri-build?",),
  22. )
  23. .into_compile_error(),
  24. );
  25. quote!()
  26. }
  27. }
  28. }
  29. pub fn entry_point(_attributes: TokenStream, item: TokenStream) -> TokenStream {
  30. let function = parse_macro_input!(item as ItemFn);
  31. let function_name = function.sig.ident.clone();
  32. let mut error = None;
  33. let domain = get_env_var("TAURI_ANDROID_PACKAGE_PREFIX", |r| r, &mut error, &function);
  34. let app_name = get_env_var(
  35. "CARGO_PKG_NAME",
  36. |r| r.replace('-', "_"),
  37. &mut error,
  38. &function,
  39. );
  40. let domain_str = var("TAURI_MOBILE_DOMAIN").unwrap();
  41. let app_name_str = var("CARGO_PKG_NAME").unwrap();
  42. if let Some(e) = error {
  43. quote!(#e).into()
  44. } else {
  45. quote!(
  46. fn stop_unwind<F: FnOnce() -> T, T>(f: F) -> T {
  47. match std::panic::catch_unwind(std::panic::AssertUnwindSafe(f)) {
  48. Ok(t) => t,
  49. Err(err) => {
  50. eprintln!("attempt to unwind out of `rust` with err: {:?}", err);
  51. std::process::abort()
  52. }
  53. }
  54. }
  55. #function
  56. fn _start_app() {
  57. #[cfg(target_os = "ios")]
  58. ::tauri::init_logging(&format!("{}.{}", #domain_str, #app_name_str));
  59. #[cfg(target_os = "android")]
  60. {
  61. ::tauri::init_logging(#app_name_str);
  62. use ::tauri::paste;
  63. ::tauri::wry_android_binding!(#domain, #app_name, _start_app, ::tauri::wry);
  64. }
  65. stop_unwind(#function_name);
  66. }
  67. #[cfg(not(target_os = "android"))]
  68. #[no_mangle]
  69. #[inline(never)]
  70. pub extern "C" fn start_app() {
  71. _start_app()
  72. }
  73. )
  74. .into()
  75. }
  76. }