mobile.rs 2.1 KB

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