crossbundle_derive/
lib.rs

1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use quote::quote;
5use syn::{parse_macro_input, ItemFn};
6
7fn crossbundle_main_logic(_attr: TokenStream, item: TokenStream) -> TokenStream {
8    let input = parse_macro_input!(item as ItemFn);
9    if input.sig.ident != "main" {
10        panic!("crossbundle_main can only be used on a function called 'main'")
11    }
12    TokenStream::from(quote! {
13        #[no_mangle]
14        #[cfg(target_os = "android")]
15        unsafe extern "C" fn ANativeActivity_onCreate(
16            activity: *mut std::os::raw::c_void,
17            saved_state: *mut std::os::raw::c_void,
18            saved_state_size: usize,
19        ) {
20            crossbow::ndk_glue::init(
21                activity as _,
22                saved_state as _,
23                saved_state_size as _,
24                main,
25            );
26        }
27
28        #[allow(unused)]
29        #input
30    })
31}
32
33#[proc_macro_attribute]
34pub fn crossbundle_main(attr: TokenStream, item: TokenStream) -> TokenStream {
35    crossbundle_main_logic(attr, item)
36}