Skip to content

Commit 42a6e4b

Browse files
committed
feat: added implementations for has_digits and remove_digits
1 parent 240cbdc commit 42a6e4b

1 file changed

Lines changed: 88 additions & 4 deletions

File tree

crates/core/src/runtime/functions/number.rs

Lines changed: 88 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
use std::f64;
22

3-
use tucana::shared::{number_value, NumberValue, Value, value::Kind};
3+
use tucana::shared::helper::value::ToValue;
4+
use tucana::shared::{NumberValue, Value, number_value, value::Kind};
45

56
use crate::context::argument::Argument;
67
use crate::context::context::Context;
78
use crate::context::macros::{args, no_args};
89
use crate::context::registry::{HandlerFn, HandlerFunctionEntry, IntoFunctionEntry};
910
use crate::context::signal::Signal;
1011
use crate::runtime::error::RuntimeError;
11-
use crate::value::{number_to_f64, value_from_f64, value_from_i64};
12+
use crate::value::{number_to_f64, number_to_i64_lossy, value_from_f64, value_from_i64};
1213

1314
fn num_f64(n: &NumberValue) -> Result<f64, Signal> {
1415
number_to_f64(n).ok_or_else(|| {
@@ -59,9 +60,52 @@ pub fn collect_number_functions() -> Vec<(&'static str, HandlerFunctionEntry)> {
5960
("std::number::cosh", HandlerFn::eager(cosh, 1)),
6061
("std::number::clamp", HandlerFn::eager(clamp, 3)),
6162
("std::number::is_equal", HandlerFn::eager(is_equal, 2)),
63+
("std::number::has_digits", HandlerFn::eager(has_digits, 2)),
64+
(
65+
"std::number::remove_digits",
66+
HandlerFn::eager(remove_digits, 2),
67+
),
6268
]
6369
}
6470

71+
fn has_digits(
72+
args: &[Argument],
73+
_ctx: &mut Context,
74+
_run: &mut dyn FnMut(i64, &mut Context) -> Signal,
75+
) -> Signal {
76+
args!(args => value: NumberValue);
77+
78+
match value.number {
79+
Some(number) => match number {
80+
number_value::Number::Integer(_) => return Signal::Success(false.to_value()),
81+
number_value::Number::Float(_) => return Signal::Success(true.to_value()),
82+
},
83+
None => {
84+
return Signal::Failure(RuntimeError::simple_str(
85+
"InvlaidArgumentExeption",
86+
"Had NumberValue but no inner number value (was null)",
87+
));
88+
}
89+
}
90+
}
91+
92+
fn remove_digits(
93+
args: &[Argument],
94+
_ctx: &mut Context,
95+
_run: &mut dyn FnMut(i64, &mut Context) -> Signal,
96+
) -> Signal {
97+
args!(args => value: NumberValue);
98+
match number_to_i64_lossy(&value) {
99+
Some(number) => return Signal::Success(value_from_i64(number)),
100+
None => {
101+
return Signal::Failure(RuntimeError::simple_str(
102+
"InvlaidArgumentExeption",
103+
"Had NumberValue but no inner number value (was null)",
104+
));
105+
}
106+
}
107+
}
108+
65109
fn add(
66110
args: &[Argument],
67111
_ctx: &mut Context,
@@ -792,13 +836,16 @@ mod tests {
792836
use super::*;
793837
use crate::context::argument::Argument;
794838
use crate::context::context::Context;
795-
use crate::value::{number_to_f64, value_from_f64};
796-
use tucana::shared::{Value, value::Kind};
839+
use crate::value::{number_to_f64, value_from_f64, value_from_i64};
840+
use tucana::shared::{number_value, Value, value::Kind};
797841

798842
// ---- helpers: Arguments ----
799843
fn a_num(n: f64) -> Argument {
800844
Argument::Eval(value_from_f64(n))
801845
}
846+
fn a_int(n: i64) -> Argument {
847+
Argument::Eval(value_from_i64(n))
848+
}
802849
fn a_str(s: &str) -> Argument {
803850
Argument::Eval(Value {
804851
kind: Some(Kind::StringValue(s.to_string())),
@@ -822,6 +869,20 @@ mod tests {
822869
other => panic!("Expected BoolValue, got {:?}", other),
823870
}
824871
}
872+
fn expect_int(sig: Signal) -> i64 {
873+
match sig {
874+
Signal::Success(Value {
875+
kind: Some(Kind::NumberValue(n)),
876+
}) => match n.number {
877+
Some(number_value::Number::Integer(i)) => i,
878+
Some(number_value::Number::Float(f)) => {
879+
panic!("Expected Integer NumberValue, got Float({})", f)
880+
}
881+
None => panic!("Expected Integer NumberValue, got None"),
882+
},
883+
other => panic!("Expected NumberValue, got {:?}", other),
884+
}
885+
}
825886
fn expect_str(sig: Signal) -> String {
826887
match sig {
827888
Signal::Success(Value {
@@ -854,6 +915,29 @@ mod tests {
854915
);
855916
}
856917

918+
#[test]
919+
fn test_has_digits_and_remove_digits() {
920+
let mut ctx = Context::default();
921+
922+
let mut run = dummy_run;
923+
assert!(!expect_bool(has_digits(&[a_int(42)], &mut ctx, &mut run)));
924+
925+
let mut run = dummy_run;
926+
assert!(expect_bool(has_digits(&[a_num(42.5)], &mut ctx, &mut run)));
927+
928+
let mut run = dummy_run;
929+
assert_eq!(
930+
expect_int(remove_digits(&[a_int(123)], &mut ctx, &mut run)),
931+
123
932+
);
933+
934+
let mut run = dummy_run;
935+
assert_eq!(
936+
expect_int(remove_digits(&[a_num(12.99)], &mut ctx, &mut run)),
937+
12
938+
);
939+
}
940+
857941
#[test]
858942
fn test_substract_and_divide() {
859943
let mut ctx = Context::default();

0 commit comments

Comments
 (0)