From 1f79501026e00f6789dba97bd83322c997f8e928 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guillermo=20D=C3=ADaz?= Date: Mon, 8 Sep 2025 08:37:42 +0200 Subject: [PATCH 1/2] feat(rad): new RadonInteger operators --- rad/src/operators/integer.rs | 18 ++++++++++++++++-- rad/src/operators/mod.rs | 7 +++---- rad/src/types/integer.rs | 15 +++++++++------ 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/rad/src/operators/integer.rs b/rad/src/operators/integer.rs index 557e220db..70e3cdaf7 100644 --- a/rad/src/operators/integer.rs +++ b/rad/src/operators/integer.rs @@ -5,8 +5,8 @@ use serde_cbor::value::{Value, from_value}; use crate::{ error::RadError, types::{ - RadonType, boolean::RadonBoolean, float::RadonFloat, integer::RadonInteger, - string::RadonString, + RadonType, boolean::RadonBoolean, bytes::RadonBytes, float::RadonFloat, + integer::RadonInteger, string::RadonString, }, }; @@ -20,6 +20,20 @@ pub fn absolute(input: &RadonInteger) -> Result { } } +pub fn to_bytes(input: RadonInteger) -> Result { + let mut bytes_array = [0u8; 16]; + bytes_array.copy_from_slice(&input.value().to_be_bytes()); + let mut leading_zeros = 0; + for i in 0..bytes_array.len() { + if bytes_array[i] != 0u8 { + break; + } else { + leading_zeros += 1; + } + } + Ok(RadonBytes::from(bytes_array[leading_zeros..].to_vec())) +} + pub fn to_float(input: RadonInteger) -> Result { RadonFloat::try_from(Value::Integer(input.value())) } diff --git a/rad/src/operators/mod.rs b/rad/src/operators/mod.rs index f57c5b9b7..021c49dea 100644 --- a/rad/src/operators/mod.rs +++ b/rad/src/operators/mod.rs @@ -54,16 +54,15 @@ pub enum RadonOpCodes { /////////////////////////////////////////////////////////////////////// // Integer operator codes (start at 0x40) IntegerAbsolute = 0x40, - IntegerAsFloat = 0x41, - IntegerAsString = 0x42, IntegerGreaterThan = 0x43, IntegerLessThan = 0x44, - // IntegerMatch = 0x45, IntegerModulo = 0x46, IntegerMultiply = 0x47, IntegerNegate = 0x48, IntegerPower = 0x49, - // IntegerReciprocal = 0x4A, + IntegerToBytes = 0x4A, + IntegerToFloat = 0x41, + IntegerToString = 0x42, // IntegerSum = 0x4B, /////////////////////////////////////////////////////////////////////// // Float operator codes (start at 0x50) diff --git a/rad/src/types/integer.rs b/rad/src/types/integer.rs index c6a1c4346..a45cf5f71 100644 --- a/rad/src/types/integer.rs +++ b/rad/src/types/integer.rs @@ -105,12 +105,6 @@ impl Operable for RadonInteger { (RadonOpCodes::IntegerAbsolute, None) => { integer_operators::absolute(self).map(RadonTypes::from) } - (RadonOpCodes::IntegerAsFloat, None) => { - integer_operators::to_float(self.clone()).map(RadonTypes::from) - } - (RadonOpCodes::IntegerAsString, None) => { - integer_operators::to_string(self.clone()).map(RadonTypes::from) - } (RadonOpCodes::IntegerGreaterThan, Some(args)) => { integer_operators::greater_than(self, args).map(Into::into) } @@ -129,6 +123,15 @@ impl Operable for RadonInteger { (RadonOpCodes::IntegerPower, Some(args)) => { integer_operators::power(self, args.as_slice()).map(Into::into) } + (RadonOpCodes::IntegerToBytes, None) => integer_operators::to_bytes(self.clone()) + .map(RadonTypes::from) + .map_err(Into::into), + (RadonOpCodes::IntegerToFloat, None) => { + integer_operators::to_float(self.clone()).map(RadonTypes::from) + } + (RadonOpCodes::IntegerToString, None) => { + integer_operators::to_string(self.clone()).map(RadonTypes::from) + } // Unsupported / unimplemented (op_code, args) => Err(RadError::UnsupportedOperator { input_type: RADON_INTEGER_TYPE_NAME.to_string(), From 630231e4c81237bca490b3c28668e429dc5d6ddb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guillermo=20D=C3=ADaz?= Date: Mon, 8 Sep 2025 09:23:55 +0200 Subject: [PATCH 2/2] chore(rad): cargo clippy --- rad/src/operators/integer.rs | 4 ++-- rad/src/types/integer.rs | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/rad/src/operators/integer.rs b/rad/src/operators/integer.rs index 70e3cdaf7..4a50696c5 100644 --- a/rad/src/operators/integer.rs +++ b/rad/src/operators/integer.rs @@ -24,8 +24,8 @@ pub fn to_bytes(input: RadonInteger) -> Result { let mut bytes_array = [0u8; 16]; bytes_array.copy_from_slice(&input.value().to_be_bytes()); let mut leading_zeros = 0; - for i in 0..bytes_array.len() { - if bytes_array[i] != 0u8 { + for charcode in bytes_array { + if charcode != 0u8 { break; } else { leading_zeros += 1; diff --git a/rad/src/types/integer.rs b/rad/src/types/integer.rs index a45cf5f71..9a0644dbe 100644 --- a/rad/src/types/integer.rs +++ b/rad/src/types/integer.rs @@ -124,8 +124,7 @@ impl Operable for RadonInteger { integer_operators::power(self, args.as_slice()).map(Into::into) } (RadonOpCodes::IntegerToBytes, None) => integer_operators::to_bytes(self.clone()) - .map(RadonTypes::from) - .map_err(Into::into), + .map(RadonTypes::from), (RadonOpCodes::IntegerToFloat, None) => { integer_operators::to_float(self.clone()).map(RadonTypes::from) }