@@ -31,13 +31,6 @@ pub(crate) fn expand_from_variant(derive_data: DeriveData) -> Result<TokenStream
31
31
}
32
32
}
33
33
Repr :: Enum ( variants) => {
34
- if variants. is_empty ( ) {
35
- return Err ( syn:: Error :: new (
36
- ident. span ( ) ,
37
- "cannot derive FromVariant for an uninhabited enum" ,
38
- ) ) ;
39
- }
40
-
41
34
let var_input_ident = Ident :: new ( "__enum_variant" , Span :: call_site ( ) ) ;
42
35
43
36
let var_ident_strings: Vec < String > = variants
@@ -62,46 +55,55 @@ pub(crate) fn expand_from_variant(derive_data: DeriveData) -> Result<TokenStream
62
55
63
56
let var_input_ident_iter = std:: iter:: repeat ( & var_input_ident) ;
64
57
58
+ // Return `FromVariantError` if input is an uninhabitable enum
59
+ let early_return = variants. is_empty ( ) . then ( || {
60
+ quote ! {
61
+ return Err ( FVE :: UnknownEnumVariant {
62
+ variant: __key,
63
+ expected: & [ ] ,
64
+ } ) ;
65
+ }
66
+ } ) ;
67
+
65
68
quote ! {
66
- {
67
- let __dict = :: gdnative:: core_types:: Dictionary :: from_variant( #input_ident)
68
- . map_err( |__err| FVE :: InvalidEnumRepr {
69
- expected: VariantEnumRepr :: ExternallyTagged ,
70
- error: std:: boxed:: Box :: new( __err) ,
71
- } ) ?;
72
-
73
- let __keys = __dict. keys( ) ;
74
- if __keys. len( ) != 1 {
75
- Err ( FVE :: InvalidEnumRepr {
76
- expected: VariantEnumRepr :: ExternallyTagged ,
77
- error: std:: boxed:: Box :: new( FVE :: InvalidLength {
78
- expected: 1 ,
79
- len: __keys. len( ) as usize ,
80
- } ) ,
81
- } )
82
- }
83
- else {
84
- let __key = String :: from_variant( & __keys. get( 0 ) )
85
- . map_err( |__err| FVE :: InvalidEnumRepr {
86
- expected: VariantEnumRepr :: ExternallyTagged ,
87
- error: std:: boxed:: Box :: new( __err) ,
88
- } ) ?;
89
- match __key. as_str( ) {
90
- #(
91
- #ref_var_ident_string_literals => {
92
- let #var_input_ident_iter = & __dict. get_or_nil( & __keys. get( 0 ) ) ;
93
- ( #var_from_variants) . map_err( |err| FVE :: InvalidEnumVariant {
94
- variant: #ref_var_ident_string_literals,
95
- error: std:: boxed:: Box :: new( err) ,
96
- } )
97
- } ,
98
- ) *
99
- variant => Err ( FVE :: UnknownEnumVariant {
100
- variant: variant. to_string( ) ,
101
- expected: & [ #( #ref_var_ident_string_literals) , * ] ,
102
- } ) ,
103
- }
104
- }
69
+ let __dict = :: gdnative:: core_types:: Dictionary :: from_variant( #input_ident)
70
+ . map_err( |__err| FVE :: InvalidEnumRepr {
71
+ expected: VariantEnumRepr :: ExternallyTagged ,
72
+ error: std:: boxed:: Box :: new( __err) ,
73
+ } ) ?;
74
+ let __keys = __dict. keys( ) ;
75
+ if __keys. len( ) != 1 {
76
+ return Err ( FVE :: InvalidEnumRepr {
77
+ expected: VariantEnumRepr :: ExternallyTagged ,
78
+ error: std:: boxed:: Box :: new( FVE :: InvalidLength {
79
+ expected: 1 ,
80
+ len: __keys. len( ) as usize ,
81
+ } ) ,
82
+ } )
83
+ }
84
+
85
+ let __key = String :: from_variant( & __keys. get( 0 ) )
86
+ . map_err( |__err| FVE :: InvalidEnumRepr {
87
+ expected: VariantEnumRepr :: ExternallyTagged ,
88
+ error: std:: boxed:: Box :: new( __err) ,
89
+ } ) ?;
90
+
91
+ #early_return
92
+
93
+ match __key. as_str( ) {
94
+ #(
95
+ #ref_var_ident_string_literals => {
96
+ let #var_input_ident_iter = & __dict. get_or_nil( & __keys. get( 0 ) ) ;
97
+ ( #var_from_variants) . map_err( |err| FVE :: InvalidEnumVariant {
98
+ variant: #ref_var_ident_string_literals,
99
+ error: std:: boxed:: Box :: new( err) ,
100
+ } )
101
+ } ,
102
+ ) *
103
+ variant => Err ( FVE :: UnknownEnumVariant {
104
+ variant: variant. to_string( ) ,
105
+ expected: & [ #( #ref_var_ident_string_literals) , * ] ,
106
+ } ) ,
105
107
}
106
108
}
107
109
}
0 commit comments