11use std:: collections:: HashMap ;
22
3- use super :: parser:: { Expr , Parser } ;
3+ use chrono:: NaiveDate ;
4+
5+ use super :: { parser:: { Expr , Parser } , lexer:: TokenKind } ;
46
57pub type Vars = HashMap < String , Evalue > ;
68
@@ -11,18 +13,21 @@ pub enum Evalue {
1113 String ( String ) ,
1214 Number ( f64 ) ,
1315 Bool ( bool ) ,
16+ Date ( NaiveDate ) ,
1417}
1518impl Evalue {
1619 fn to_bool ( & self ) -> bool {
1720 match self {
1821 Evalue :: String ( v) => v != "" && v != "0" ,
1922 Evalue :: Number ( n) => * n != 0.0 ,
2023 Evalue :: Bool ( b) => * b,
24+ Evalue :: Date ( _) => true ,
2125 }
2226 }
2327
2428 fn to_string ( & self ) -> String {
2529 match self {
30+ Evalue :: Date ( d) => d. to_string ( ) ,
2631 Evalue :: String ( v) => v. clone ( ) ,
2732 Evalue :: Number ( n) => format ! ( "{}" , * n) ,
2833 Evalue :: Bool ( b) => match b {
@@ -49,7 +54,7 @@ impl Evaluator {
4954
5055 pub fn evaluate ( & self , expr : & Expr , vars : & Vars ) -> Result < bool , String > {
5156 match self . evaluate_expr ( & expr, vars) ? {
52- Evalue :: String ( _) | Evalue :: Number ( _) => {
57+ Evalue :: Date ( _ ) | Evalue :: String ( _) | Evalue :: Number ( _) => {
5358 Err ( format ! ( "expression must evluate to a boolean, got: {:?}" , expr) . to_string ( ) )
5459 }
5560 Evalue :: Bool ( b) => Ok ( b) ,
@@ -58,27 +63,28 @@ impl Evaluator {
5863
5964 fn evaluate_expr ( & self , expr : & super :: parser:: Expr , vars : & Vars ) -> Result < Evalue , String > {
6065 match expr {
61- super :: parser:: Expr :: Boolean ( b) => Ok ( Evalue :: Bool ( * b) ) ,
62- super :: parser:: Expr :: String ( s) => Ok ( Evalue :: String ( s. clone ( ) ) ) ,
63- super :: parser:: Expr :: Binary ( lexpr, op, rexpr) => {
66+ Expr :: Boolean ( b) => Ok ( Evalue :: Bool ( * b) ) ,
67+ Expr :: String ( s) => Ok ( Evalue :: String ( s. clone ( ) ) ) ,
68+ Expr :: Date ( s) => Ok ( Evalue :: Date ( s. clone ( ) ) ) ,
69+ Expr :: Binary ( lexpr, op, rexpr) => {
6470 let lval = self . evaluate_expr ( lexpr, vars) ?;
6571 let rval = self . evaluate_expr ( rexpr, vars) ?;
6672 let eval = match op {
67- super :: lexer :: TokenKind :: GreaterThan => Ok ( lval > rval) ,
68- super :: lexer :: TokenKind :: GreaterThanEqual => Ok ( lval >= rval) ,
69- super :: lexer :: TokenKind :: LessThanEqual => Ok ( lval <= rval) ,
70- super :: lexer :: TokenKind :: LessThan => Ok ( lval < rval) ,
71- super :: lexer :: TokenKind :: Equal => Ok ( lval == rval) ,
72- super :: lexer :: TokenKind :: FuzzyEqual => Ok ( lval. to_string ( ) . contains ( rval. to_string ( ) . as_str ( ) ) ) ,
73- super :: lexer :: TokenKind :: NotEqual => Ok ( lval != rval) ,
74- super :: lexer :: TokenKind :: NotFuzzyEqual => Ok ( !lval. to_string ( ) . contains ( rval. to_string ( ) . as_str ( ) ) ) ,
75- super :: lexer :: TokenKind :: Or => Ok ( lval. to_bool ( ) || rval. to_bool ( ) ) ,
76- super :: lexer :: TokenKind :: And => Ok ( lval. to_bool ( ) && rval. to_bool ( ) ) ,
73+ TokenKind :: GreaterThan => Ok ( lval > rval) ,
74+ TokenKind :: GreaterThanEqual => Ok ( lval >= rval) ,
75+ TokenKind :: LessThanEqual => Ok ( lval <= rval) ,
76+ TokenKind :: LessThan => Ok ( lval < rval) ,
77+ TokenKind :: Equal => Ok ( lval == rval) ,
78+ TokenKind :: FuzzyEqual => Ok ( lval. to_string ( ) . contains ( rval. to_string ( ) . as_str ( ) ) ) ,
79+ TokenKind :: NotEqual => Ok ( lval != rval) ,
80+ TokenKind :: NotFuzzyEqual => Ok ( !lval. to_string ( ) . contains ( rval. to_string ( ) . as_str ( ) ) ) ,
81+ TokenKind :: Or => Ok ( lval. to_bool ( ) || rval. to_bool ( ) ) ,
82+ TokenKind :: And => Ok ( lval. to_bool ( ) && rval. to_bool ( ) ) ,
7783 _ => Err ( format ! ( "unknown operator: {:?}" , op) ) ,
7884 } ?;
7985 Ok ( Evalue :: Bool ( eval) )
8086 }
81- super :: parser :: Expr :: Number ( n) => Ok ( Evalue :: Number ( * n) ) ,
87+ Expr :: Number ( n) => Ok ( Evalue :: Number ( * n) ) ,
8288 super :: parser:: Expr :: Variable ( v) => match vars. get ( v) {
8389 Some ( v) => Ok ( v. clone ( ) ) ,
8490 None => Err ( format ! ( "Unknown variable `{}`" , v) ) ,
@@ -124,5 +130,9 @@ mod test {
124130 assert_eq ! ( true , result. unwrap( ) ) ;
125131 let result = Evaluator :: new ( ) . parse_and_evaluate ( "type != 'Run'" , & map) ;
126132 assert_eq ! ( false , result. unwrap( ) ) ;
133+ let result = Evaluator :: new ( ) . parse_and_evaluate ( "2024-01-06 > 2020-01-06" , & map) ;
134+ assert_eq ! ( true , result. unwrap( ) ) ;
135+ let result = Evaluator :: new ( ) . parse_and_evaluate ( "2024-01-06 < 2020-01-06" , & map) ;
136+ assert_eq ! ( false , result. unwrap( ) ) ;
127137 }
128138}
0 commit comments