shared_tokio_runtime_macros/
lib.rs

1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use quote::quote;
5use syn::{parse_macro_input, parse_quote, Attribute, Item, Stmt};
6
7#[proc_macro_attribute]
8pub fn runtime_test(_metadata: TokenStream, input: TokenStream) -> TokenStream {
9    let input: Item = match parse_macro_input!(input as Item) {
10        Item::Fn(mut fn_item) => {
11            fn_item.sig.asyncness = None;
12            let test_attr: Attribute = parse_quote! {
13                #[::core::prelude::v1::test]
14            };
15            fn_item.attrs.push(test_attr);
16            let old_block = fn_item.block.clone();
17            let new_block_stmt: Stmt = parse_quote! {
18                shared_tokio_runtime::rt().block_on(async {
19                    #old_block
20                });
21            };
22            fn_item.block.stmts = vec![new_block_stmt];
23            Item::Fn(fn_item)
24        },
25        _ => {
26            panic!("The `runtime` macro attribute is only valid when called on a fn.")
27        }
28    };
29    TokenStream::from(quote! (#input))
30}