trident_derive_fuzz_deserialize/
lib.rs1use 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}