Skip to content

Commit 3fd4024

Browse files
committed
fix enum generation for named fields and tuples
1 parent 1d09bb0 commit 3fd4024

File tree

1 file changed

+34
-5
lines changed

1 file changed

+34
-5
lines changed

crates/anchor-idl/src/typedef.rs

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use std::collections::BTreeMap;
33
use anchor_lang_idl_spec::{
44
IdlArrayLen, IdlDefinedFields, IdlEnumVariant, IdlField, IdlType, IdlTypeDef,
55
};
6+
use heck::ToSnakeCase;
67
use proc_macro2::{Ident, TokenStream};
78
use quote::{format_ident, quote};
89

@@ -137,7 +138,7 @@ pub fn get_type_properties(defs: &[IdlTypeDef], ty: &IdlType) -> FieldListProper
137138
}
138139
}
139140

140-
/// Generates struct fields from a list of [IdlField]s.
141+
/// Generates enum fields from a list of [IdlField]s.
141142
pub fn generate_enum_fields(fields: &[IdlField]) -> TokenStream {
142143
let fields_rendered = fields.iter().map(|arg| {
143144
let name = format_ident!("{}", arg.name.to_snake_case());
@@ -152,6 +153,20 @@ pub fn generate_enum_fields(fields: &[IdlField]) -> TokenStream {
152153
}
153154
}
154155

156+
/// Generates enum tuple types from a list of [IdlType]s.
157+
pub fn generate_enum_tuple_types(fields: &[IdlType]) -> TokenStream {
158+
let fields_rendered = fields.iter().map(|arg| {
159+
let type_name = crate::ty_to_rust_type(&arg);
160+
let stream: proc_macro2::TokenStream = type_name.parse().unwrap();
161+
quote! {
162+
#stream
163+
}
164+
});
165+
quote! {
166+
#(#fields_rendered),*
167+
}
168+
}
169+
155170
/// Generates a struct.
156171
pub fn generate_struct(
157172
defs: &[IdlTypeDef],
@@ -217,14 +232,20 @@ pub fn generate_enum(
217232
let variant_idents = variants.iter().map(|v| {
218233
let name = format_ident!("{}", v.name);
219234
match &v.fields {
220-
Some(EnumFields::Named(idl_fields)) => {
235+
Some(IdlDefinedFields::Named(idl_fields)) => {
221236
let fields = generate_enum_fields(idl_fields);
222237
quote! {
223238
#name {
224239
#fields
225240
}
226241
}
227242
}
243+
Some(IdlDefinedFields::Tuple(idl_fields)) => {
244+
let types = generate_enum_tuple_types(idl_fields);
245+
quote! {
246+
#name(#types)
247+
}
248+
}
228249
_ => {
229250
quote! {
230251
#name
@@ -244,11 +265,17 @@ pub fn generate_enum(
244265

245266
let default_impl = match variants.first() {
246267
Some(IdlEnumVariant {
247-
fields: Some(EnumFields::Named(fields)),
268+
fields: Some(IdlDefinedFields::Named(fields)),
248269
..
249270
}) if fields.len() > 0 => {
250271
quote! {}
251272
}
273+
Some(IdlEnumVariant {
274+
fields: Some(IdlDefinedFields::Tuple(types)),
275+
..
276+
}) if types.len() > 0 => {
277+
quote! {}
278+
}
252279
_ => {
253280
let default_variant = format_ident!("{}", variants.first().unwrap().name);
254281
quote! {
@@ -261,15 +288,17 @@ pub fn generate_enum(
261288
}
262289
};
263290

264-
quote! {
291+
let result = quote! {
265292
#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug)]
266293
#derive_copy
267294
pub enum #enum_name {
268295
#(#variant_idents),*
269296
}
270297

271298
#default_impl
272-
}
299+
};
300+
301+
result
273302
}
274303

275304
/// Generates structs and enums.

0 commit comments

Comments
 (0)