futures_cputask_derive/
lib.rs

1extern crate proc_macro;
2
3use crate::proc_macro::TokenStream;
4use quote::quote;
5use syn::{parse_macro_input, ItemFn};
6
7/// Makes a synchronous function asynchronous using futures-cputask
8///
9/// Note: this function may not take any non-static references
10/// Member methods have to take an `Arc<Self>`
11#[proc_macro_attribute]
12pub fn async_task(_attr: TokenStream, item: TokenStream) -> TokenStream {
13    let input = parse_macro_input!(item as ItemFn);
14    let attrs = input.attrs;
15    let vis = input.vis;
16    let sig = input.sig;
17    let block = input.block;
18
19    let output = quote!{
20        #(#attrs)*
21        #vis async #sig {
22            futures_cputask::run_task(move || {#block}).await
23        }
24    };
25    output.into()
26}