hala_test/
lib.rs

1use proc_macro::TokenStream;
2use quote::{quote, quote_spanned};
3use syn::{parse_macro_input, spanned::Spanned, ItemFn, TypePath};
4
5#[proc_macro_attribute]
6pub fn test(attr: TokenStream, item: TokenStream) -> TokenStream {
7    let runner_path = parse_macro_input!(attr as TypePath);
8
9    let item_fn = parse_macro_input!(item as ItemFn);
10
11    if item_fn.sig.asyncness.is_none() {
12        return TokenStream::from(quote_spanned! { item_fn.span() =>
13            compile_error!("the async keyword is missing from the function declaration"),
14        });
15    }
16
17    let fn_name = &item_fn.sig.ident;
18
19    let test_name = item_fn.sig.ident.to_string();
20
21    quote! {
22        #[::core::prelude::v1::test]
23        fn #fn_name() {
24            #item_fn
25
26            #runner_path(#test_name,#fn_name);
27        }
28    }
29    .into()
30}