@@ -151,10 +151,15 @@ impl Operator for Add {
151151
152152 fn eval ( & self , arguments : & [ Value ] , _context : & Context ) -> EvalexprResult < Value > {
153153 expect_operator_argument_amount ( arguments. len ( ) , 2 ) ?;
154- expect_number ( & arguments[ 0 ] ) ?;
155- expect_number ( & arguments[ 1 ] ) ?;
156-
157- if let ( Ok ( a) , Ok ( b) ) = ( arguments[ 0 ] . as_int ( ) , arguments[ 1 ] . as_int ( ) ) {
154+ expect_number_or_string ( & arguments[ 0 ] ) ?;
155+ expect_number_or_string ( & arguments[ 1 ] ) ?;
156+
157+ if let ( Ok ( a) , Ok ( b) ) = ( arguments[ 0 ] . as_string ( ) , arguments[ 1 ] . as_string ( ) ) {
158+ let mut result = String :: with_capacity ( a. len ( ) + b. len ( ) ) ;
159+ result. push_str ( & a) ;
160+ result. push_str ( & b) ;
161+ Ok ( Value :: String ( result) )
162+ } else if let ( Ok ( a) , Ok ( b) ) = ( arguments[ 0 ] . as_int ( ) , arguments[ 1 ] . as_int ( ) ) {
158163 let result = a. checked_add ( b) ;
159164 if let Some ( result) = result {
160165 Ok ( Value :: Int ( result) )
@@ -400,10 +405,16 @@ impl Operator for Gt {
400405
401406 fn eval ( & self , arguments : & [ Value ] , _context : & Context ) -> EvalexprResult < Value > {
402407 expect_operator_argument_amount ( arguments. len ( ) , 2 ) ?;
403- expect_number ( & arguments[ 0 ] ) ?;
404- expect_number ( & arguments[ 1 ] ) ?;
408+ expect_number_or_string ( & arguments[ 0 ] ) ?;
409+ expect_number_or_string ( & arguments[ 1 ] ) ?;
405410
406- if let ( Ok ( a) , Ok ( b) ) = ( arguments[ 0 ] . as_int ( ) , arguments[ 1 ] . as_int ( ) ) {
411+ if let ( Ok ( a) , Ok ( b) ) = ( arguments[ 0 ] . as_string ( ) , arguments[ 1 ] . as_string ( ) ) {
412+ if a > b {
413+ Ok ( Value :: Boolean ( true ) )
414+ } else {
415+ Ok ( Value :: Boolean ( false ) )
416+ }
417+ } else if let ( Ok ( a) , Ok ( b) ) = ( arguments[ 0 ] . as_int ( ) , arguments[ 1 ] . as_int ( ) ) {
407418 if a > b {
408419 Ok ( Value :: Boolean ( true ) )
409420 } else {
@@ -430,10 +441,16 @@ impl Operator for Lt {
430441
431442 fn eval ( & self , arguments : & [ Value ] , _context : & Context ) -> EvalexprResult < Value > {
432443 expect_operator_argument_amount ( arguments. len ( ) , 2 ) ?;
433- expect_number ( & arguments[ 0 ] ) ?;
434- expect_number ( & arguments[ 1 ] ) ?;
444+ expect_number_or_string ( & arguments[ 0 ] ) ?;
445+ expect_number_or_string ( & arguments[ 1 ] ) ?;
435446
436- if let ( Ok ( a) , Ok ( b) ) = ( arguments[ 0 ] . as_int ( ) , arguments[ 1 ] . as_int ( ) ) {
447+ if let ( Ok ( a) , Ok ( b) ) = ( arguments[ 0 ] . as_string ( ) , arguments[ 1 ] . as_string ( ) ) {
448+ if a < b {
449+ Ok ( Value :: Boolean ( true ) )
450+ } else {
451+ Ok ( Value :: Boolean ( false ) )
452+ }
453+ } else if let ( Ok ( a) , Ok ( b) ) = ( arguments[ 0 ] . as_int ( ) , arguments[ 1 ] . as_int ( ) ) {
437454 if a < b {
438455 Ok ( Value :: Boolean ( true ) )
439456 } else {
@@ -460,10 +477,16 @@ impl Operator for Geq {
460477
461478 fn eval ( & self , arguments : & [ Value ] , _context : & Context ) -> EvalexprResult < Value > {
462479 expect_operator_argument_amount ( arguments. len ( ) , 2 ) ?;
463- expect_number ( & arguments[ 0 ] ) ?;
464- expect_number ( & arguments[ 1 ] ) ?;
480+ expect_number_or_string ( & arguments[ 0 ] ) ?;
481+ expect_number_or_string ( & arguments[ 1 ] ) ?;
465482
466- if let ( Ok ( a) , Ok ( b) ) = ( arguments[ 0 ] . as_int ( ) , arguments[ 1 ] . as_int ( ) ) {
483+ if let ( Ok ( a) , Ok ( b) ) = ( arguments[ 0 ] . as_string ( ) , arguments[ 1 ] . as_string ( ) ) {
484+ if a >= b {
485+ Ok ( Value :: Boolean ( true ) )
486+ } else {
487+ Ok ( Value :: Boolean ( false ) )
488+ }
489+ } else if let ( Ok ( a) , Ok ( b) ) = ( arguments[ 0 ] . as_int ( ) , arguments[ 1 ] . as_int ( ) ) {
467490 if a >= b {
468491 Ok ( Value :: Boolean ( true ) )
469492 } else {
@@ -490,10 +513,16 @@ impl Operator for Leq {
490513
491514 fn eval ( & self , arguments : & [ Value ] , _context : & Context ) -> EvalexprResult < Value > {
492515 expect_operator_argument_amount ( arguments. len ( ) , 2 ) ?;
493- expect_number ( & arguments[ 0 ] ) ?;
494- expect_number ( & arguments[ 1 ] ) ?;
516+ expect_number_or_string ( & arguments[ 0 ] ) ?;
517+ expect_number_or_string ( & arguments[ 1 ] ) ?;
495518
496- if let ( Ok ( a) , Ok ( b) ) = ( arguments[ 0 ] . as_int ( ) , arguments[ 1 ] . as_int ( ) ) {
519+ if let ( Ok ( a) , Ok ( b) ) = ( arguments[ 0 ] . as_string ( ) , arguments[ 1 ] . as_string ( ) ) {
520+ if a <= b {
521+ Ok ( Value :: Boolean ( true ) )
522+ } else {
523+ Ok ( Value :: Boolean ( false ) )
524+ }
525+ } else if let ( Ok ( a) , Ok ( b) ) = ( arguments[ 0 ] . as_int ( ) , arguments[ 1 ] . as_int ( ) ) {
497526 if a <= b {
498527 Ok ( Value :: Boolean ( true ) )
499528 } else {
0 commit comments