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