diff --git a/gdnative-derive/src/export.rs b/gdnative-derive/src/export.rs index 340daabc2..8efa519f0 100644 --- a/gdnative-derive/src/export.rs +++ b/gdnative-derive/src/export.rs @@ -7,7 +7,7 @@ pub(crate) fn derive_export(input: &DeriveInput) -> syn::Result { _ => { return Err(syn::Error::new( input.ident.span(), - "#[derive(Export)] can only use on enum", + "#[derive(Export)] only supports fieldless enums", )) } }; @@ -17,23 +17,35 @@ pub(crate) fn derive_export(input: &DeriveInput) -> syn::Result { } fn impl_export(enum_ty: &syn::Ident, data: &syn::DataEnum) -> syn::Result { - let mappings = { - let mut m = Vec::with_capacity(data.variants.len()); - - for variant in &data.variants { - if !matches!(variant.fields, Fields::Unit) { - return Err(syn::Error::new( + let err = data + .variants + .iter() + .filter_map(|variant| { + (!matches!(variant.fields, Fields::Unit)).then(|| { + syn::Error::new( variant.ident.span(), "#[derive(Export)] only supports fieldless enums", - )); - } + ) + }) + }) + .reduce(|mut acc, err| { + acc.combine(err); + acc + }); + if let Some(err) = err { + return Err(err); + } + + let mappings = data + .variants + .iter() + .map(|variant| { let key = &variant.ident; let val = quote! { #enum_ty::#key as i64 }; - m.push(quote! { (stringify!(#key).to_string(), #val) }); - } + quote! { (stringify!(#key).to_string(), #val) } + }) + .collect::>(); - m - }; let impl_block = quote! { impl ::gdnative::export::Export for #enum_ty { type Hint = ::gdnative::export::hint::IntHint; diff --git a/gdnative/tests/ui/export_fail_01.rs b/gdnative/tests/ui/export_fail_01.rs index 4ce672339..c69fed7d3 100644 --- a/gdnative/tests/ui/export_fail_01.rs +++ b/gdnative/tests/ui/export_fail_01.rs @@ -3,6 +3,7 @@ use gdnative::prelude::*; #[derive(Export, ToVariant)] pub enum Foo { Bar(String), + Baz { a: i32, b: u32 }, } fn main() {} diff --git a/gdnative/tests/ui/export_fail_01.stderr b/gdnative/tests/ui/export_fail_01.stderr index 47cc9bd87..79cc55485 100644 --- a/gdnative/tests/ui/export_fail_01.stderr +++ b/gdnative/tests/ui/export_fail_01.stderr @@ -3,3 +3,9 @@ error: #[derive(Export)] only supports fieldless enums | 5 | Bar(String), | ^^^ + +error: #[derive(Export)] only supports fieldless enums + --> tests/ui/export_fail_01.rs:6:5 + | +6 | Baz { a: i32, b: u32 }, + | ^^^