shared_tokio_runtime_macros/
lib.rs1extern 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}