From 340541b0a417e25bbb47c846335e5d53715200e1 Mon Sep 17 00:00:00 2001 From: Jovan Gerodetti Date: Wed, 22 Nov 2023 13:01:46 +0100 Subject: [PATCH] handle godot setting invalid types (#14) Godot might set an invalid type like null when the value is not nullable. --- derive/src/lib.rs | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/derive/src/lib.rs b/derive/src/lib.rs index 0614b4e..418804f 100644 --- a/derive/src/lib.rs +++ b/derive/src/lib.rs @@ -269,16 +269,24 @@ fn derive_set_fields<'a>(public_fields: impl Iterator + 'a Err(err) => return err.write_errors(), }; - let variant_value = quote!(#godot_types::prelude::FromGodot::from_variant(&value)); + let variant_value = quote!(#godot_types::prelude::FromGodot::try_from_variant(&value)); let assignment = match opts.set { - Some(setter) => quote_spanned!(setter.span() => #setter(self, #variant_value)), - None => quote!(self.#field_ident = #variant_value), + Some(setter) => quote_spanned!(setter.span() => #setter(self, local_value)), + None => quote!(self.#field_ident = local_value), }; quote_spanned! { field_ident.span() => - #field_name => #assignment, + #field_name => { + let local_value = match #variant_value { + Ok(v) => v, + Err(_) => return false, + }; + + #assignment; + true + }, } }) .collect(); @@ -288,10 +296,8 @@ fn derive_set_fields<'a>(public_fields: impl Iterator + 'a match name.to_string().as_str() { #set_field_dispatch - _ => return false, + _ => false, } - - true } } }