trident_derive_fuzz_deserialize/
lib.rs

1use proc_macro::TokenStream;
2use quote::{format_ident, quote};
3use syn::{parse_macro_input, Data, DeriveInput};
4
5#[proc_macro_derive(FuzzDeserialize)]
6pub fn fuzz_deserialize(input: TokenStream) -> TokenStream {
7    let input = parse_macro_input!(input as DeriveInput);
8
9    let fuzz_deser_impls = match &input.data {
10        Data::Enum(enum_data) => {
11            let fuzz_deser_impl = enum_data.variants.iter().map(|variant| {
12                let variant_name = &variant.ident;
13                let snapshot_name = format_ident!("{}Snapshot", variant_name);
14                quote! {
15                    impl<'info> FuzzDeserialize<'info> for #variant_name {
16                        type Ix = #snapshot_name<'info>;
17                        fn deserialize_option(
18                            &self,
19                            _program_id: &anchor_lang::prelude::Pubkey,
20                            accounts: &'info mut [Option<AccountInfo<'info>>],
21                        ) -> Result<Self::Ix, FuzzingError> {
22                            Self::Ix::deserialize_option(_program_id,accounts)
23                        }
24                    }
25                }
26            });
27
28            quote! { #(#fuzz_deser_impl)* }
29        }
30        _ => panic!("DisplayIx can only be derived for enums"),
31    };
32
33    TokenStream::from(fuzz_deser_impls)
34}