1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use syn::parse_macro_input;
5
6use crate::test_suite::TestSuite;
7
8mod constructor;
9mod hooks;
10mod test_case;
11mod test_suite;
12
13#[proc_macro_attribute]
14pub fn test_suite(attr: TokenStream, item: TokenStream) -> TokenStream {
15 let suite_name = parse_macro_input!(attr as syn::Lit);
16 let input = parse_macro_input!(item as syn::ItemImpl);
17 test_suite_impl(suite_name, input)
18 .unwrap_or_else(syn::Error::into_compile_error)
19 .into()
20}
21
22fn test_suite_impl(
23 suite_name: syn::Lit,
24 input: syn::ItemImpl,
25) -> syn::Result<proc_macro2::TokenStream> {
26 let suite = TestSuite::from_impl(suite_name, input)?;
27 Ok(suite.render())
28}