@@ -29,23 +29,24 @@ impl Function for GreaterOrEquals {
2929 }
3030
3131 fn accepted_arg_types ( & self ) -> Vec < AcceptedArgKind > {
32- vec ! [ AcceptedArgKind :: Number , AcceptedArgKind :: Number ]
32+ vec ! [ AcceptedArgKind :: Number , AcceptedArgKind :: String ]
3333 }
3434
3535 fn invoke ( & self , args : & [ Value ] , _context : & Context ) -> Result < Value , DscError > {
3636 debug ! ( "{}" , t!( "functions.greaterOrEquals.invoked" ) ) ;
3737
38- let num1 = match & args[ 0 ] {
39- Value :: Number ( n) => n. as_f64 ( ) . ok_or_else ( || DscError :: Parser ( t ! ( "functions.invalidArguments" ) . to_string ( ) ) ) ?,
40- _ => return Err ( DscError :: Parser ( t ! ( "functions.invalidArguments" ) . to_string ( ) ) ) ,
41- } ;
38+ let first = & args[ 0 ] ;
39+ let second = & args[ 1 ] ;
4240
43- let num2 = match & args[ 1 ] {
44- Value :: Number ( n) => n. as_f64 ( ) . ok_or_else ( || DscError :: Parser ( t ! ( "functions.invalidArguments" ) . to_string ( ) ) ) ?,
45- _ => return Err ( DscError :: Parser ( t ! ( "functions.invalidArguments" ) . to_string ( ) ) ) ,
46- } ;
41+ if let ( Some ( num1) , Some ( num2) ) = ( first. as_i64 ( ) , second. as_i64 ( ) ) {
42+ return Ok ( Value :: Bool ( num1 >= num2) ) ;
43+ }
4744
48- Ok ( Value :: Bool ( num1 >= num2) )
45+ if let ( Some ( str1) , Some ( str2) ) = ( first. as_str ( ) , second. as_str ( ) ) {
46+ return Ok ( Value :: Bool ( str1 >= str2) ) ;
47+ }
48+
49+ Err ( DscError :: Parser ( t ! ( "functions.typeMismatch" ) . to_string ( ) ) )
4950 }
5051}
5152
@@ -74,4 +75,11 @@ mod tests {
7475 let result = parser. parse_and_execute ( "[greaterOrEquals(5,5)]" , & Context :: new ( ) ) . unwrap ( ) ;
7576 assert_eq ! ( result, true ) ;
7677 }
78+
79+ #[ test]
80+ fn string_greater_or_equals ( ) {
81+ let mut parser = Statement :: new ( ) . unwrap ( ) ;
82+ let result = parser. parse_and_execute ( "[greaterOrEquals('b','a')]" , & Context :: new ( ) ) . unwrap ( ) ;
83+ assert_eq ! ( result, true ) ;
84+ }
7785}
0 commit comments