@@ -3,6 +3,7 @@ use std::collections::BTreeMap;
33use anchor_lang_idl_spec:: {
44 IdlArrayLen , IdlDefinedFields , IdlEnumVariant , IdlField , IdlType , IdlTypeDef ,
55} ;
6+ use heck:: ToSnakeCase ;
67use proc_macro2:: { Ident , TokenStream } ;
78use 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.
141142pub 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.
156171pub 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