bevy_derive/
bevy_main.rs

1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{parse_macro_input, ItemFn};
4
5pub fn bevy_main(_attr: TokenStream, item: TokenStream) -> TokenStream {
6    let input = parse_macro_input!(item as ItemFn);
7    assert_eq!(
8        input.sig.ident, "main",
9        "`bevy_main` can only be used on a function called 'main'."
10    );
11
12    TokenStream::from(quote! {
13        // SAFETY: `#[bevy_main]` should only be placed on a single `main` function
14        // TODO: Potentially make `bevy_main` and unsafe attribute as there is a safety
15        // guarantee required from the caller.
16        #[unsafe(no_mangle)]
17        #[cfg(target_os = "android")]
18        fn android_main(android_app: bevy::window::android_activity::AndroidApp) {
19            let _ = bevy::window::ANDROID_APP.set(android_app);
20            main();
21        }
22
23        #[allow(unused)]
24        #input
25    })
26}