From a3daf8eebfe410e8b2d8ef5d09f09ab14842c705 Mon Sep 17 00:00:00 2001 From: Manuel Pelloni Date: Fri, 5 Dec 2025 18:20:01 +0100 Subject: [PATCH] feat: impl `From` primitive numbers for integers --- benzina/src/int.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/benzina/src/int.rs b/benzina/src/int.rs index a7a1bf4..6364cae 100644 --- a/benzina/src/int.rs +++ b/benzina/src/int.rs @@ -227,6 +227,18 @@ macro_rules! from_numbers { } } +macro_rules! from_primitive_numbers { + ($($from:ident => $to:ident),*) => { + $( + impl From<$from> for $to { + fn from(value: $from) -> Self { + Self::new(value.into()).unwrap() + } + } + )* + } +} + impl_numbers! { U15 => u16, i16, SmallInt, U31 => u32, i32, Integer, @@ -239,6 +251,15 @@ from_numbers! { U31 => U63 } +from_primitive_numbers! { + u8 => U15, + u8 => U31, + u8 => U63, + u16 => U31, + u16 => U63, + u32 => U63 +} + #[cfg(test)] mod tests { use super::{U15, U31, U63}; @@ -381,6 +402,18 @@ mod tests { assert!(U15::try_from(-1i16).is_err()); } + #[test] + fn test_from_primitive_numbers() { + assert_eq!(U15::new(u8::MAX.into()).unwrap(), u8::MAX.into()); + + assert_eq!(U31::new(u8::MAX.into()).unwrap(), u8::MAX.into()); + assert_eq!(U31::new(u16::MAX.into()).unwrap(), u16::MAX.into()); + + assert_eq!(U63::new(u8::MAX.into()).unwrap(), u8::MAX.into()); + assert_eq!(U63::new(u16::MAX.into()).unwrap(), u16::MAX.into()); + assert_eq!(U63::new(u32::MAX.into()).unwrap(), u32::MAX.into()); + } + #[test] fn test_ordering() { let a = U15::new(100).unwrap();