@@ -7,7 +7,7 @@ pub(crate) fn derive_export(input: &DeriveInput) -> syn::Result<TokenStream2> {
7
7
_ => {
8
8
return Err ( syn:: Error :: new (
9
9
input. ident . span ( ) ,
10
- "#[derive(Export)] can only use on enum " ,
10
+ "#[derive(Export)] only supports fieldless enums " ,
11
11
) )
12
12
}
13
13
} ;
@@ -17,23 +17,35 @@ pub(crate) fn derive_export(input: &DeriveInput) -> syn::Result<TokenStream2> {
17
17
}
18
18
19
19
fn impl_export ( enum_ty : & syn:: Ident , data : & syn:: DataEnum ) -> syn:: Result < TokenStream2 > {
20
- let mappings = {
21
- let mut m = Vec :: with_capacity ( data . variants . len ( ) ) ;
22
-
23
- for variant in & data . variants {
24
- if !matches ! ( variant. fields, Fields :: Unit ) {
25
- return Err ( syn:: Error :: new (
20
+ let err = data
21
+ . variants
22
+ . iter ( )
23
+ . filter_map ( |variant| {
24
+ ( !matches ! ( variant. fields, Fields :: Unit ) ) . then ( || {
25
+ syn:: Error :: new (
26
26
variant. ident . span ( ) ,
27
27
"#[derive(Export)] only supports fieldless enums" ,
28
- ) ) ;
29
- }
28
+ )
29
+ } )
30
+ } )
31
+ . reduce ( |mut acc, err| {
32
+ acc. combine ( err) ;
33
+ acc
34
+ } ) ;
35
+ if let Some ( err) = err {
36
+ return Err ( err) ;
37
+ }
38
+
39
+ let mappings = data
40
+ . variants
41
+ . iter ( )
42
+ . map ( |variant| {
30
43
let key = & variant. ident ;
31
44
let val = quote ! { #enum_ty:: #key as i64 } ;
32
- m. push ( quote ! { ( stringify!( #key) . to_string( ) , #val) } ) ;
33
- }
45
+ quote ! { ( stringify!( #key) . to_string( ) , #val) }
46
+ } )
47
+ . collect :: < Vec < _ > > ( ) ;
34
48
35
- m
36
- } ;
37
49
let impl_block = quote ! {
38
50
impl :: gdnative:: export:: Export for #enum_ty {
39
51
type Hint = :: gdnative:: export:: hint:: IntHint <i64 >;
0 commit comments