--- a/src/shared/discriminant_assigner.rs +++ b/src/shared/discriminant_assigner.rs @@ -26,20 +26,20 @@ let discriminant_expr = &discriminant.1; let variant_name = &variant.ident; - let Expr::Lit(ExprLit { lit: Lit::Int(int), .. }) = discriminant_expr else { + if let Expr::Lit(ExprLit { lit: Lit::Int(int), .. }) = discriminant_expr { + let discriminant_value: u128 = int.base10_parse().unwrap_or_else(unreachable); + if discriminant_value > self.max_value() { + abort!(variant, "Value of variant exceeds the given number of bits") + } + + Some(discriminant_value) + } else { abort!( discriminant_expr, "variant `{}` is not a number", variant_name; help = "only literal integers currently supported" ) - }; - - let discriminant_value: u128 = int.base10_parse().unwrap_or_else(unreachable); - if discriminant_value > self.max_value() { - abort!(variant, "Value of variant exceeds the given number of bits") } - - Some(discriminant_value) } fn assign(&mut self, variant: &Variant) -> u128 { --- a/src/shared/fallback.rs +++ b/src/shared/fallback.rs @@ -22,8 +22,9 @@ } Unnamed(fields) => { let variant_fields = fields.unnamed.iter(); - let Ok(fallback_value) = variant_fields.exactly_one() else { - abort!(variant, "fallback variant must have exactly one field"; help = "use only one field or change to a unit variant") + let fallback_value = match variant_fields.exactly_one() { + Ok(ok) => ok, + _ => abort!(variant, "fallback variant must have exactly one field"; help = "use only one field or change to a unit variant") }; if !is_last_variant {