libtest_mimic_collect_macro/
lib.rs1use proc_macro::TokenStream;
2use proc_macro2::{Ident, Span};
3use quote::quote;
4use syn::{parse_macro_input, ItemFn, LitStr};
5
6#[proc_macro_attribute]
9pub fn test(_args: TokenStream, input: TokenStream) -> TokenStream {
10    let ItemFn { sig, block, .. } = parse_macro_input!(input as ItemFn);
11
12    let ident = &sig.ident;
13    let test_name = ident.to_string();
14    let test_name_str = LitStr::new(&test_name, Span::call_site());
15    let ctor_name = format!("__{}_add_test", test_name);
16    let ctor_ident = Ident::new(&ctor_name, Span::call_site());
17
18    (quote! {
19        #sig #block
20
21        #[::libtest_mimic_collect::ctor]
22        fn #ctor_ident() {
23            use ::libtest_mimic_collect::ConvertResult;
24            ::libtest_mimic_collect::TestCollection::add_test(
25                ::libtest_mimic_collect::libtest_mimic::Trial::test(
26                    #test_name_str,
27                    || -> Result<(), ::libtest_mimic_collect::libtest_mimic::Failed> {
28                        match ::std::panic::catch_unwind(|| {
29                            ::libtest_mimic_collect::TestCollection::convert_result(#ident())
30                        }) {
31                            Ok(Ok(())) => Ok(()),
32                            Ok(Err(err)) => Err(err),
33                            Err(err) => Err(format!("{:?}", err).into()),
34                        }
35                    }
36                )
37            );
38        }
39    })
40    .into()
41}