1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
extern crate proc_macro; use proc_macro::TokenStream; use quote::quote; use std::str::FromStr; use syn::{parse_macro_input, ItemFn, Stmt}; #[proc_macro_attribute] pub fn vault_test(_attr: TokenStream, item: TokenStream) -> TokenStream { let original_fn = parse_macro_input!(item as ItemFn); let original_fn_ident = original_fn.sig.ident; let import_test = TokenStream::from_str( format!( "use ockam_vault_test_suite::{};", original_fn_ident.to_string() ) .as_str(), ) .unwrap(); let import_test: Stmt = syn::parse(import_test).expect("B"); let run_test = TokenStream::from_str(format!("{}(&mut vault);", original_fn_ident.to_string()).as_str()) .unwrap(); let run_test: Stmt = syn::parse(run_test).expect("B"); let output_function = quote! { #[test] fn #original_fn_ident() { #import_test let mut vault = new_vault(); #run_test } }; TokenStream::from(output_function) } #[proc_macro_attribute] pub fn vault_test_sync(_attr: TokenStream, item: TokenStream) -> TokenStream { let original_fn = parse_macro_input!(item as ItemFn); let original_fn_ident = original_fn.sig.ident; let import_test = TokenStream::from_str( format!( "use ockam_vault_test_suite::{};", original_fn_ident.to_string() ) .as_str(), ) .unwrap(); let import_test: Stmt = syn::parse(import_test).expect("B"); let run_test = TokenStream::from_str(format!("{}(&mut vault);", original_fn_ident.to_string()).as_str()) .unwrap(); let run_test: Stmt = syn::parse(run_test).expect("B"); let output_function = quote! { #[test] fn #original_fn_ident() { #import_test use crate::{Vault, VaultSync}; let (mut ctx, mut executor) = ockam_node::start_node(); executor .execute(async move { let vault = new_vault(); let mut vault = VaultSync::create(&ctx, vault).unwrap(); #run_test ctx.stop().await.unwrap() }) .unwrap(); } }; TokenStream::from(output_function) }