From 8fc3b30023970b0f142ceec1694ded846ce2b65b Mon Sep 17 00:00:00 2001 From: Noa Date: Fri, 13 Mar 2026 12:30:42 -0500 Subject: [PATCH] Allow byte literals in TryFromPrimitive alternatives --- num_enum/tests/try_from_primitive.rs | 2 +- num_enum_derive/src/parsing.rs | 22 +++++++++++++--------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/num_enum/tests/try_from_primitive.rs b/num_enum/tests/try_from_primitive.rs index f65b542..852e80c 100644 --- a/num_enum/tests/try_from_primitive.rs +++ b/num_enum/tests/try_from_primitive.rs @@ -393,7 +393,7 @@ fn alternative_values() { #[repr(i8)] enum Enum { Zero = 0, - #[num_enum(alternatives = [-1, 2, 3])] + #[num_enum(alternatives = [-1, 2, b'\x03'])] OneTwoThreeOrMinusOne = 1, } diff --git a/num_enum_derive/src/parsing.rs b/num_enum_derive/src/parsing.rs index c0aced1..b4b9886 100644 --- a/num_enum_derive/src/parsing.rs +++ b/num_enum_derive/src/parsing.rs @@ -429,16 +429,20 @@ fn parse_discriminant(val_exp: &Expr) -> Result { unsigned_expr = expr; sign = -1; } - if let Expr::Lit(ExprLit { - lit: Lit::Int(ref lit_int), - .. - }) = unsigned_expr - { - Ok(DiscriminantValue::Literal( + match unsigned_expr { + Expr::Lit(ExprLit { + lit: Lit::Int(lit_int), + .. + }) => Ok(DiscriminantValue::Literal( sign * lit_int.base10_parse::()?, - )) - } else { - Ok(DiscriminantValue::Expr(val_exp.clone())) + )), + Expr::Lit(ExprLit { + lit: Lit::Byte(lit_byte), + .. + }) => Ok(DiscriminantValue::Literal( + sign * i128::from(lit_byte.value()), + )), + _ => Ok(DiscriminantValue::Expr(val_exp.clone())), } }