trident_derive_fuzz_test_executor/
lib.rs1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{parse_macro_input, Data, DeriveInput};
4
5#[proc_macro_derive(FuzzTestExecutor)]
6pub fn fuzz_test_executor(input: TokenStream) -> TokenStream {
7 let input = parse_macro_input!(input as DeriveInput);
8 let enum_name = &input.ident;
9
10 let display_impl = match &input.data {
11 Data::Enum(enum_data) => {
12 let display_match_arms = enum_data.variants.iter().map(|variant| {
13 let variant_name = &variant.ident;
14 quote! {
15 #enum_name::#variant_name (ix) => {
16
17 trident_fuzz::fuzzing::TransactionExecutor::process_transaction(
18 &self.to_context_string(),
19 client,
20 ix,
21 config,
22 accounts
23 )?;
24
25 }
26 }
27 });
28
29 quote! {
30 impl FuzzTestExecutor<FuzzAccounts> for FuzzInstruction {
31 fn run_fuzzer(
32 &self,
33 accounts: &RefCell<FuzzAccounts>,
34 client: &mut impl trident_fuzz::fuzzing::FuzzClient,
35 config: &trident_fuzz::fuzzing::TridentConfig,
36 ) -> core::result::Result<(), trident_fuzz::fuzzing::FuzzClientErrorWithOrigin> {
37 match self {
38 #(#display_match_arms)*
39 }
40 Ok(())
41 }
42 }
43 }
44 }
45 _ => panic!("FuzzTestExecutor can only be derived for enums"),
46 };
47
48 TokenStream::from(display_impl)
49}