fluvio_test_derive/
lib.rs

1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use quote::quote;
5use syn::ItemFn;
6use syn::Ident;
7use proc_macro2::Span;
8
9
10#[proc_macro_attribute]
11pub fn test_async(args: TokenStream, item: TokenStream) -> TokenStream {
12
13    use syn::AttributeArgs;
14
15    let attribute_args = syn::parse_macro_input!(args as AttributeArgs);
16    let input = syn::parse_macro_input!(item as ItemFn);
17    let name = &input.sig.ident;
18    let sync_name = format!("{}_sync",name);
19    let out_fn_iden = Ident::new(&sync_name, Span::call_site());
20
21    let test_attributes = generate::generate_test_attributes(&attribute_args);
22
23    let expression = quote! {
24
25        #[test]
26        #test_attributes
27        fn #out_fn_iden()  {
28
29            ::fluvio_future::subscriber::init_logger();
30
31            #input
32
33            let ft = async {
34                #name().await
35            };
36
37            #[cfg(not(target_arch = "wasm32"))]
38            if let Err(err) = ::fluvio_future::task::run_block_on(ft) {
39                assert!(false,"error: {:?}",err);
40            }
41            #[cfg(target_arch = "wasm32")]
42            ::fluvio_future::task::run_block_on(ft);
43
44        }
45    };
46
47    expression.into()
48
49}
50
51
52#[proc_macro_attribute]
53pub fn test(args: TokenStream, item: TokenStream) -> TokenStream {
54
55    use syn::AttributeArgs;
56
57    let attribute_args = syn::parse_macro_input!(args as AttributeArgs);
58    let input = syn::parse_macro_input!(item as ItemFn);
59    let name = &input.sig.ident;
60    let sync_name = format!("{}_sync",name);
61    let out_fn_iden = Ident::new(&sync_name, Span::call_site());
62
63    let test_attributes = generate::generate_test_attributes(&attribute_args);
64
65    let expression = quote! {
66
67        #[test]
68        #test_attributes
69        fn #out_fn_iden()  {
70
71            ::fluvio_future::subscriber::init_logger();
72
73            #input
74
75            let ft = async {
76                #name().await;
77            };
78
79            
80            ::fluvio_future::task::run_block_on(ft);
81
82        }
83    };
84
85    expression.into()
86
87}
88
89
90
91mod generate {
92
93    use proc_macro2::TokenStream;
94    use syn::NestedMeta;
95    use quote::quote;
96
97    pub fn generate_test_attributes(attributes: &Vec<NestedMeta>) -> TokenStream {
98        
99        let args = attributes.iter().map(|meta| {
100            quote! {
101                #[#meta]
102            }
103        });
104
105        quote! {
106
107            #(#args)*
108
109        }
110    }
111}