glapp_macros/
lib.rs

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")/*,not(feature="miniquad")*/)) {
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	/*if cfg!(feature="miniquad") {
66		out.extend(quote!{
67			pub fn main() {
68				let b=#parent::glapp::app_window_miniquad::AppWindowBuilderMiniquad::new();
69				#name(#parent::glapp::App::new(b));
70			}
71		});
72	}*/
73
74	TokenStream::from(out)
75}