Skip to content

Commit a12fd4d

Browse files
committed
feat(Export): report compile error for all non-fieldless enum variants
1 parent 7d7bdd7 commit a12fd4d

File tree

3 files changed

+32
-13
lines changed

3 files changed

+32
-13
lines changed

gdnative-derive/src/export.rs

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ pub(crate) fn derive_export(input: &DeriveInput) -> syn::Result<TokenStream2> {
77
_ => {
88
return Err(syn::Error::new(
99
input.ident.span(),
10-
"#[derive(Export)] can only use on enum",
10+
"#[derive(Export)] only supports fieldless enums",
1111
))
1212
}
1313
};
@@ -17,23 +17,35 @@ pub(crate) fn derive_export(input: &DeriveInput) -> syn::Result<TokenStream2> {
1717
}
1818

1919
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(
2626
variant.ident.span(),
2727
"#[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| {
3043
let key = &variant.ident;
3144
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<_>>();
3448

35-
m
36-
};
3749
let impl_block = quote! {
3850
impl ::gdnative::export::Export for #enum_ty {
3951
type Hint = ::gdnative::export::hint::IntHint<i64>;

gdnative/tests/ui/export_fail_01.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use gdnative::prelude::*;
33
#[derive(Export, ToVariant)]
44
pub enum Foo {
55
Bar(String),
6+
Baz { a: i32, b: u32 },
67
}
78

89
fn main() {}

gdnative/tests/ui/export_fail_01.stderr

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,9 @@ error: #[derive(Export)] only supports fieldless enums
33
|
44
5 | Bar(String),
55
| ^^^
6+
7+
error: #[derive(Export)] only supports fieldless enums
8+
--> tests/ui/export_fail_01.rs:6:5
9+
|
10+
6 | Baz { a: i32, b: u32 },
11+
| ^^^

0 commit comments

Comments
 (0)