Skip to content

Commit ef9fb61

Browse files
committed
feat(ExportEnum): correctly return error for from_variant
1 parent 3e6defc commit ef9fb61

File tree

1 file changed

+11
-5
lines changed

1 file changed

+11
-5
lines changed

gdnative-derive/src/export_enum.rs

+11-5
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ fn impl_to_variant(enum_ty: &syn::Ident, _data: &syn::DataEnum) -> syn::Result<T
3838
}
3939

4040
fn impl_from_variant(enum_ty: &syn::Ident, data: &syn::DataEnum) -> syn::Result<TokenStream2> {
41-
let as_int = quote! { n };
41+
let n = quote! { n };
4242
let arms = data
4343
.variants
4444
.iter()
@@ -51,21 +51,27 @@ fn impl_from_variant(enum_ty: &syn::Ident, data: &syn::DataEnum) -> syn::Result<
5151
))
5252
} else {
5353
Ok(quote! {
54-
if #as_int == #enum_ty::#ident as i64 { Ok(#enum_ty::#ident) }
54+
if #n == #enum_ty::#ident as i64 { Ok(#enum_ty::#ident) }
5555
})
5656
}
5757
})
5858
.collect::<Result<Vec<_>, _>>()?;
59+
let expected_variants = data
60+
.variants
61+
.iter()
62+
.map(|variant| quote! { stringify!(#variant.ident) });
5963

6064
let impl_block = quote! {
6165
impl ::gdnative::core_types::FromVariant for #enum_ty {
6266
#[inline]
6367
fn from_variant(variant: &::gdnative::core_types::Variant) -> Result<Self, ::gdnative::core_types::FromVariantError> {
64-
let #as_int = variant.try_to::<i64>()?;
68+
let #n = variant.try_to::<i64>()?;
6569
#(#arms)else *
66-
// TODO: return FromVariantError
6770
else {
68-
Err(FromVariantError::Unspecified)
71+
Err(FromVariantError::UnknownEnumVariant {
72+
variant: variant.to_string(),
73+
expected: &[#(#expected_variants),*],
74+
})
6975
}
7076
}
7177
}

0 commit comments

Comments
 (0)