arara_macros/
lib.rs

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}