use ::num_enum::FromPrimitive; // Guard against https://github.com/illicitonion/num_enum/issues/27 mod alloc {} mod core {} mod num_enum {} mod std {} macro_rules! has_from_primitive_number { ( $type:ty ) => { paste::paste! { #[test] fn []() { #[derive(Debug, Eq, PartialEq, FromPrimitive)] #[repr($type)] enum Enum { Zero = 0, #[num_enum(default)] NonZero = 1, } let zero = Enum::from_primitive(0 as $type); assert_eq!(zero, Enum::Zero); let one = Enum::from_primitive(1 as $type); assert_eq!(one, Enum::NonZero); let two = Enum::from_primitive(2 as $type); assert_eq!(two, Enum::NonZero); } } }; } has_from_primitive_number!(u8); has_from_primitive_number!(u16); has_from_primitive_number!(u32); has_from_primitive_number!(u64); has_from_primitive_number!(usize); has_from_primitive_number!(i8); has_from_primitive_number!(i16); has_from_primitive_number!(i32); has_from_primitive_number!(i64); has_from_primitive_number!(isize); // repr with 128-bit type is unstable // has_from_primitive_number!(u128); // has_from_primitive_number!(i128); #[test] fn has_from_primitive_number_standard_default_attribute() { #[derive(Debug, Eq, PartialEq, FromPrimitive)] #[repr(u8)] enum Enum { Zero = 0, #[default] NonZero = 1, } let zero = Enum::from_primitive(0_u8); assert_eq!(zero, Enum::Zero); let one = Enum::from_primitive(1_u8); assert_eq!(one, Enum::NonZero); let two = Enum::from_primitive(2_u8); assert_eq!(two, Enum::NonZero); } #[test] fn from_primitive_number() { #[derive(Debug, Eq, PartialEq, FromPrimitive)] #[repr(u8)] enum Enum { #[num_enum(default)] Whatever = 0, } // #[derive(FromPrimitive)] generates implementations for the following traits: // // - `FromPrimitive` // - `From` // - `TryFromPrimitive` // - `TryFrom` let from_primitive = Enum::from_primitive(0_u8); assert_eq!(from_primitive, Enum::Whatever); let from = Enum::from(0_u8); assert_eq!(from, Enum::Whatever); let from_primitive = Enum::from_primitive(1_u8); assert_eq!(from_primitive, Enum::Whatever); let from = Enum::from(1_u8); assert_eq!(from, Enum::Whatever); } #[test] fn from_primitive_number_catch_all() { #[derive(Debug, Eq, PartialEq, FromPrimitive)] #[repr(u8)] enum Enum { Zero = 0, #[num_enum(catch_all)] NonZero(u8), } let zero = Enum::from_primitive(0_u8); assert_eq!(zero, Enum::Zero); let one = Enum::from_primitive(1_u8); assert_eq!(one, Enum::NonZero(1_u8)); let two = Enum::from_primitive(2_u8); assert_eq!(two, Enum::NonZero(2_u8)); } #[test] fn from_primitive_number_catch_all_in_middle() { #[derive(Debug, PartialEq, Eq, FromPrimitive)] #[repr(u8)] enum Enum { Zero = 0, #[num_enum(catch_all)] Else(u8) = 2, One = 1, } let zero = Enum::from_primitive(0_u8); assert_eq!(zero, Enum::Zero); let one = Enum::from_primitive(1_u8); assert_eq!(one, Enum::One); let two = Enum::from_primitive(2_u8); assert_eq!(two, Enum::Else(2_u8)); let three = Enum::from_primitive(3_u8); assert_eq!(three, Enum::Else(3_u8)); } #[cfg(feature = "complex-expressions")] #[test] fn from_primitive_number_with_inclusive_range() { #[derive(Debug, Eq, PartialEq, FromPrimitive)] #[repr(u8)] enum Enum { Zero = 0, #[num_enum(alternatives = [2..=255])] NonZero, } let zero = Enum::from_primitive(0_u8); assert_eq!(zero, Enum::Zero); let one = Enum::from_primitive(1_u8); assert_eq!(one, Enum::NonZero); let two = Enum::from_primitive(2_u8); assert_eq!(two, Enum::NonZero); let three = Enum::from_primitive(3_u8); assert_eq!(three, Enum::NonZero); let twofivefive = Enum::from_primitive(255_u8); assert_eq!(twofivefive, Enum::NonZero); }