@@ -77,83 +77,86 @@ pub fn impl_from_value_for_enum(
77
77
78
78
next_discriminant = & discriminant + BigInt :: from ( 1u8 ) ;
79
79
80
- if discriminant < BigInt :: default ( ) || discriminant > BigInt :: from ( u16:: MAX ) {
81
- if !item_attrs. allow_invalid_discriminants
82
- && !variant_attrs. allow_invalid_discriminants
83
- && !* item_attrs. is_integer
84
- && !* item_attrs. is_string
80
+ if !* item_attrs. is_string && !* item_attrs. is_integer {
81
+ if !item_attrs. allow_invalid_discriminants && !variant_attrs. allow_invalid_discriminants
85
82
{
86
- crate :: warn:: print_warning (
87
- "negative discriminants for MySql enums are discouraging" ,
88
- format ! ( "#[mysql(allow_invalid_discriminants)]\n enum {} {{" , ident) ,
89
- "use the following annotation to suppress this warning" ,
90
- )
91
- . unwrap ( ) ;
83
+ if discriminant < BigInt :: default ( ) {
84
+ crate :: warn:: print_warning (
85
+ "negative discriminants for MySql enums are discouraging" ,
86
+ format ! ( "#[mysql(allow_invalid_discriminants)]\n enum {} {{" , ident) ,
87
+ "use the following annotation to suppress this warning" ,
88
+ )
89
+ . unwrap ( ) ;
90
+ } else if discriminant > BigInt :: from ( u16:: MAX ) {
91
+ crate :: warn:: print_warning (
92
+ "MySql only supports up to 65535 distinct elements in an enum" ,
93
+ format ! ( "#[mysql(allow_invalid_discriminants)]\n enum {} {{" , ident) ,
94
+ "use the following annotation to suppress this warning" ,
95
+ )
96
+ . unwrap ( ) ;
97
+ }
92
98
}
93
- } else if discriminant == BigInt :: default ( )
94
- && !* item_attrs. is_integer
95
- && !* item_attrs. is_string
96
- {
97
- if variant_attrs. explicit_invalid {
98
- variant_attrs. rename = Some ( "" . into ( ) ) ;
99
- } else {
100
- abort ! ( crate :: Error :: ExplicitInvalid ( variant. span( ) ) )
99
+ if discriminant == BigInt :: default ( ) {
100
+ if variant_attrs. explicit_invalid {
101
+ variant_attrs. rename = Some ( "" . into ( ) ) ;
102
+ } else {
103
+ abort ! ( crate :: Error :: ExplicitInvalid ( variant. span( ) ) )
104
+ }
101
105
}
102
- } else {
103
- variants. push ( EnumVariant {
104
- my_attrs : variant_attrs,
105
- ident : variant. ident . clone ( ) ,
106
- name : variant. ident . to_string ( ) ,
107
- discriminant,
108
- } )
109
106
}
107
+
108
+ variants. push ( EnumVariant {
109
+ my_attrs : variant_attrs,
110
+ ident : variant. ident . clone ( ) ,
111
+ name : variant. ident . to_string ( ) ,
112
+ discriminant,
113
+ } ) ;
110
114
}
111
115
112
- if !item_attrs. allow_sparse_enum && !* item_attrs. is_integer && !* item_attrs. is_string {
113
- variants. sort_by_key ( |x| x. discriminant . clone ( ) ) ;
114
- let mut prev_discriminant = BigInt :: default ( ) ;
115
- for variant in variants. iter ( ) {
116
- let is_next = ( variant. discriminant . clone ( ) - BigInt :: from ( 1_u8 ) ) == prev_discriminant;
117
- let is_invalid =
118
- variant. discriminant == prev_discriminant && prev_discriminant == BigInt :: default ( ) ;
119
- if !is_next && !is_invalid {
120
- crate :: warn:: print_warning (
116
+ if !* item_attrs. is_integer && !* item_attrs. is_string {
117
+ if !item_attrs. allow_sparse_enum {
118
+ variants. sort_by_key ( |x| x. discriminant . clone ( ) ) ;
119
+ let mut prev_discriminant = BigInt :: default ( ) ;
120
+ for variant in variants. iter ( ) {
121
+ let is_next =
122
+ ( variant. discriminant . clone ( ) - BigInt :: from ( 1_u8 ) ) == prev_discriminant;
123
+ let is_invalid = variant. discriminant == prev_discriminant
124
+ && prev_discriminant == BigInt :: default ( ) ;
125
+ if !is_next && !is_invalid {
126
+ crate :: warn:: print_warning (
121
127
format ! ( "Sparse enum variant {}::{}. Consider annotating with #[mysql(is_integer)] or #[mysql(is_string)]." , ident, variant. ident) ,
122
128
format ! ( "#[mysql(is_integer)]\n enum {} {{" , ident) ,
123
129
"use #[mysql(allow_sparse_enum)] to suppress this warning" ,
124
130
)
125
131
. unwrap ( ) ;
132
+ }
133
+ prev_discriminant = variant. discriminant . clone ( ) ;
126
134
}
127
- prev_discriminant = variant. discriminant . clone ( ) ;
128
135
}
129
- }
130
136
131
- if min_discriminant >= BigInt :: default ( )
132
- && max_discriminant <= BigInt :: from ( u8:: MAX )
133
- && !* item_attrs. is_integer
134
- && !* item_attrs. is_string
135
- && !item_attrs. allow_suboptimal_repr
136
- {
137
- if !matches ! ( repr. 0 , EnumRepr :: U8 ( _) ) {
137
+ if min_discriminant >= BigInt :: default ( )
138
+ && max_discriminant <= BigInt :: from ( u8:: MAX )
139
+ && !item_attrs. allow_suboptimal_repr
140
+ {
141
+ if !matches ! ( repr. 0 , EnumRepr :: U8 ( _) ) {
142
+ crate :: warn:: print_warning (
143
+ "enum representation is suboptimal. Consider the following annotation:" ,
144
+ format ! ( "#[repr(u8)]\n enum {} {{" , ident) ,
145
+ "use #[mysql(allow_suboptimal_repr)] to suppress this warning" ,
146
+ )
147
+ . unwrap ( ) ;
148
+ }
149
+ } else if min_discriminant >= BigInt :: default ( )
150
+ && max_discriminant <= BigInt :: from ( u16:: MAX )
151
+ && !matches ! ( repr. 0 , EnumRepr :: U8 ( _) )
152
+ {
138
153
crate :: warn:: print_warning (
139
154
"enum representation is suboptimal. Consider the following annotation:" ,
140
- format ! ( "#[repr(u8 )]\n enum {} {{" , ident) ,
155
+ format ! ( "#[repr(u16 )]\n enum {} {{" , ident) ,
141
156
"use #[mysql(allow_suboptimal_repr)] to suppress this warning" ,
142
157
)
143
158
. unwrap ( ) ;
144
159
}
145
- } else if min_discriminant >= BigInt :: default ( )
146
- && max_discriminant <= BigInt :: from ( u16:: MAX )
147
- && !* item_attrs. is_integer
148
- && !* item_attrs. is_string
149
- && !matches ! ( repr. 0 , EnumRepr :: U8 ( _) )
150
- {
151
- crate :: warn:: print_warning (
152
- "enum representation is suboptimal. Consider the following annotation:" ,
153
- format ! ( "#[repr(u16)]\n enum {} {{" , ident) ,
154
- "use #[mysql(allow_suboptimal_repr)] to suppress this warning" ,
155
- )
156
- . unwrap ( ) ;
157
160
}
158
161
159
162
let derived = Enum {
@@ -163,7 +166,8 @@ pub fn impl_from_value_for_enum(
163
166
repr : repr. 0 ,
164
167
} ;
165
168
166
- Ok ( quote:: quote! { #derived } )
169
+ let generated = quote:: quote! { #derived } ;
170
+ Ok ( generated)
167
171
}
168
172
169
173
struct Enum {
@@ -210,26 +214,45 @@ impl ToTokens for Enum {
210
214
let n = syn:: LitInt :: new ( & discriminant. to_string ( ) , Span :: call_site ( ) ) ;
211
215
212
216
if * item_attrs. is_integer {
213
- quote:: quote!(
214
- #crat:: Value :: Int ( #n) | #crat:: Value :: UInt ( #n) => {
215
- Ok ( #ir_name( #parsed_name:: Ready ( #container_name:: #ident) ) )
216
- }
217
- )
217
+ if discriminant < & BigInt :: default ( ) {
218
+ quote:: quote!(
219
+ #crat:: Value :: Int ( #n) => {
220
+ Ok ( #ir_name( #parsed_name:: Ready ( #container_name:: #ident) ) )
221
+ }
222
+ )
223
+ } else {
224
+ quote:: quote!(
225
+ #crat:: Value :: Int ( #n) | #crat:: Value :: UInt ( #n) => {
226
+ Ok ( #ir_name( #parsed_name:: Ready ( #container_name:: #ident) ) )
227
+ }
228
+ )
229
+ }
218
230
} else if * item_attrs. is_string {
219
231
quote:: quote!(
220
232
#crat:: Value :: Bytes ( ref x) if x == #s => {
221
233
Ok ( #ir_name( #parsed_name:: Parsed ( #container_name:: #ident, v) ) )
222
234
}
223
235
)
224
236
} else {
225
- quote:: quote!(
226
- #crat:: Value :: Bytes ( ref x) if x == #s => {
227
- Ok ( #ir_name( #parsed_name:: Parsed ( #container_name:: #ident, v) ) )
228
- }
229
- #crat:: Value :: Int ( #n) | #crat:: Value :: UInt ( #n) => {
230
- Ok ( #ir_name( #parsed_name:: Ready ( #container_name:: #ident) ) )
231
- }
232
- )
237
+ if discriminant < & BigInt :: default ( ) {
238
+ quote:: quote!(
239
+ #crat:: Value :: Bytes ( ref x) if x == #s => {
240
+ Ok ( #ir_name( #parsed_name:: Parsed ( #container_name:: #ident, v) ) )
241
+ }
242
+ #crat:: Value :: Int ( #n) => {
243
+ Ok ( #ir_name( #parsed_name:: Ready ( #container_name:: #ident) ) )
244
+ }
245
+ )
246
+ } else {
247
+ quote:: quote!(
248
+ #crat:: Value :: Bytes ( ref x) if x == #s => {
249
+ Ok ( #ir_name( #parsed_name:: Parsed ( #container_name:: #ident, v) ) )
250
+ }
251
+ #crat:: Value :: Int ( #n) | #crat:: Value :: UInt ( #n) => {
252
+ Ok ( #ir_name( #parsed_name:: Ready ( #container_name:: #ident) ) )
253
+ }
254
+ )
255
+ }
233
256
}
234
257
} ,
235
258
) ;
0 commit comments