1use proc_macro::{*};
2use quote::{quote, format_ident};
3use syn::{parse_macro_input, ItemFn};
4
5#[proc_macro_attribute]
6pub fn glapp_main(attr: TokenStream, input: TokenStream) -> TokenStream {
7 let mut parent=quote!();
8 for a in attr {
9 match a {
10 TokenTree::Ident(i)=>{
11 let i=proc_macro2::Ident::new(&*i.to_string(),proc_macro2::Span::call_site());
12 parent.extend(quote!(#i));
13 },
14 _=>{panic!("expected ident as parent")}
15 }
16 }
17
18 let mut ast=parse_macro_input!(input as ItemFn);
19 ast.sig.ident=format_ident!("_glapp_main_{}",ast.sig.ident.clone().to_string());
20 let name=ast.sig.ident.clone();
21
22 if cfg!(all(not(feature="glutin"),not(feature="sdl"))) {
23 panic!("Welcome to Glapp! Please enable exactly one of the features \"sdl\" or \"glutin\" to select rendering backend. Enjoy!");
24 }
25
26 let mut out=quote!{#ast};
27
28 if cfg!(feature="glutin") {
29 out.extend(quote!{
30 #[cfg(not(target_os="android"))]
31 pub fn main() {
32 let b=#parent::glapp::app_window_glutin::AppWindowBuilderGlutin::new();
33 #name(#parent::glapp::App::new(b));
34 }
35
36 #[cfg(target_os="android")]
37 #[no_mangle]
38 pub fn android_main(android_app: ::glapp::app_window_glutin::AndroidApp) {
39 let b=#parent::glapp::app_window_glutin::AppWindowBuilderGlutin::new();
40 b.with_android_app(android_app);
41 #name(#parent::glapp::App::new(b));
42 }
43 });
44 }
45
46 if cfg!(feature="sdl") {
47 out.extend(quote!{
48 #[cfg(not(target_os="android"))]
49 pub fn main() {
50 let b=#parent::glapp::app_window_sdl::AppWindowBuilderSdl::new();
51 #name(#parent::glapp::App::new(b));
52 }
53
54 #[cfg(target_os="android")]
55 #[no_mangle]
56 #[allow(non_snake_case)]
57 pub fn SDL_main() {
58 #parent::glapp::spawn_android_log_thread();
59 let b=#parent::glapp::app_window_sdl::AppWindowBuilderSdl::new();
60 #name(#parent::glapp::App::new(b));
61 }
62 });
63 }
64
65 TokenStream::from(out)
75}