trident_derive_fuzz_test_executor/
lib.rs

1use 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}