1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{parse_macro_input, Ident};
4
5#[proc_macro_attribute]
6pub fn startup(_: TokenStream, item: TokenStream) -> TokenStream {
7 let mut func = parse_macro_input!(item as syn::ItemFn);
8
9 let original_func_name = func.sig.ident;
10 let func_name = Ident::new("arara_startup", original_func_name.span());
11 drop(original_func_name);
12
13 func.sig.ident = func_name.clone();
14
15 let token = quote! {
16 #func
17
18 fn main() {
19 let future_block = async {
20 let req = arara::proc_utils::new_request();
21 let response: arara::Response = #func_name(req).await;
22
23 println!("Status: {}", response.status);
24
25 if response.content_type.is_empty() {
26 println!("Content-Type: text/html")
27 } else {
28 println!("Content-Type: {}", response.content_type)
29 }
30
31 for (key, value) in response.headers {
32 println!("{}: {}", key, value);
33 }
34
35 if !response.body.is_empty() {
36 println!("\n{}", response.body);
37 }
38 };
39
40 arara::proc_utils::block_on(future_block);
41 }
42 };
43
44 TokenStream::from(token)
45}