diff --git a/crates/anchor-idl/src/program.rs b/crates/anchor-idl/src/program.rs index 82b41a9..7104ec6 100644 --- a/crates/anchor-idl/src/program.rs +++ b/crates/anchor-idl/src/program.rs @@ -20,6 +20,8 @@ pub struct GeneratorOptions { pub zero_copy: Option, /// List of `repr(packed)` structs. pub packed: Option, + /// List of structs that should have `Default` impl skipped. + pub skip_default: Option, } fn path_list_to_string(list: Option<&PathList>) -> HashSet { @@ -40,15 +42,23 @@ impl GeneratorOptions { let zero_copy = path_list_to_string(self.zero_copy.as_ref()); let packed = path_list_to_string(self.packed.as_ref()); + let skip_default = path_list_to_string(self.skip_default.as_ref()); + + let mut all_structs: HashSet = HashSet::new(); + for struct_item in [&zero_copy, &packed, &skip_default].into_iter().flatten() { + if !all_structs.contains(struct_item) { + all_structs.insert(struct_item.clone()); + } + } let mut struct_opts: BTreeMap = BTreeMap::new(); - let all_structs: HashSet<&String> = zero_copy.union(&packed).collect::>(); - all_structs.into_iter().for_each(|name| { + all_structs.iter().for_each(|name| { struct_opts.insert( name.to_string(), StructOpts { zero_copy: zero_copy.contains(name), packed: packed.contains(name), + skip_default: skip_default.contains(name), }, ); }); @@ -61,6 +71,7 @@ impl GeneratorOptions { pub struct StructOpts { pub packed: bool, pub zero_copy: bool, + pub skip_default: bool, } pub struct Generator { diff --git a/crates/anchor-idl/src/typedef.rs b/crates/anchor-idl/src/typedef.rs index 016f960..899a294 100644 --- a/crates/anchor-idl/src/typedef.rs +++ b/crates/anchor-idl/src/typedef.rs @@ -142,7 +142,7 @@ pub fn generate_struct( let fields_rendered = generate_fields(fields); let props = get_field_list_properties(defs, fields); - let derive_default = if props.can_derive_default { + let derive_default = if props.can_derive_default && !opts.skip_default { quote! { #[derive(Default)] } diff --git a/examples/whirlpools/src/lib.rs b/examples/whirlpools/src/lib.rs index 1e54e43..8a702d6 100644 --- a/examples/whirlpools/src/lib.rs +++ b/examples/whirlpools/src/lib.rs @@ -10,7 +10,7 @@ anchor_gen::generate_cpi_interface!( idl_path = "idl.json", zero_copy(TickArray, Tick), - packed(TickArray, Tick) + packed(TickArray, Tick), ); impl Default for state::TickArray {