1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
extern crate proc_macro;

use crate::proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, ItemFn};

/// Makes a synchronous function asynchronous using futures-cputask
///
/// Note: this function may not take any non-static references
/// Member methods have to take an `Arc<Self>`
#[proc_macro_attribute]
pub fn async_task(_attr: TokenStream, item: TokenStream) -> TokenStream {
    let input = parse_macro_input!(item as ItemFn);
    let attrs = input.attrs;
    let vis = input.vis;
    let sig = input.sig;
    let block = input.block;

    let output = quote!{
        #(#attrs)*
        #vis async #sig {
            futures_cputask::run_task(move || {#block}).await
        }
    };
    output.into()
}