11use 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
56use crate :: context:: argument:: Argument ;
67use crate :: context:: context:: Context ;
78use crate :: context:: macros:: { args, no_args} ;
89use crate :: context:: registry:: { HandlerFn , HandlerFunctionEntry , IntoFunctionEntry } ;
910use crate :: context:: signal:: Signal ;
1011use 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
1314fn 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+
65109fn 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