File tree Expand file tree Collapse file tree
providers/flagd/src/evaluator/json_logic Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1- load ("@rules_cc//cc:defs.bzl" , "cc_library" )
1+ load ("@rules_cc//cc:defs.bzl" , "cc_binary" , " cc_library" )
22
33cc_library (
44 name = "json_logic" ,
@@ -28,3 +28,13 @@ cc_library(
2828 "@nlohmann_json//:json" ,
2929 ],
3030)
31+
32+ cc_binary (
33+ name = "cli" ,
34+ srcs = ["cli.cpp" ],
35+ deps = [
36+ ":json_logic" ,
37+ "@abseil-cpp//absl/status" ,
38+ "@nlohmann_json//:json" ,
39+ ],
40+ )
Original file line number Diff line number Diff line change 1+ #include < exception>
2+ #include < iostream>
3+ #include < string>
4+
5+ #include " absl/status/status.h"
6+ #include " json_logic.h"
7+ #include " nlohmann/json.hpp"
8+
9+ int main (int argc, char ** argv) {
10+ if (argc != 3 ) {
11+ std::cerr << " Usage: " << argv[0 ] << " '<logic_json>' '<data_json>'\n " ;
12+ return 1 ;
13+ }
14+
15+ std::string logic_str = argv[1 ];
16+ std::string data_str = argv[2 ];
17+
18+ nlohmann::json logic;
19+ nlohmann::json data;
20+ try {
21+ logic = nlohmann::json::parse (logic_str);
22+ } catch (const std::exception& e) {
23+ std::cerr << " Error parsing logic JSON: " << e.what () << " \n " ;
24+ return 1 ;
25+ }
26+
27+ try {
28+ data = nlohmann::json::parse (data_str);
29+ } catch (const std::exception& e) {
30+ std::cerr << " Error parsing data JSON: " << e.what () << " \n " ;
31+ return 1 ;
32+ }
33+
34+ try {
35+ json_logic::JsonLogic evaluator;
36+ auto result = evaluator.Apply (logic, data);
37+
38+ if (!result.ok ()) {
39+ std::cerr << " Apply error: " << result.status ().ToString () << " \n " ;
40+ return 1 ;
41+ }
42+
43+ std::cout << result.value ().dump () << " \n " ;
44+ } catch (const std::exception& e) {
45+ std::cerr << " Exception during evaluation: " << e.what () << " \n " ;
46+ return 2 ;
47+ } catch (...) {
48+ std::cerr << " Unknown exception during evaluation.\n " ;
49+ return 2 ;
50+ }
51+
52+ return 0 ;
53+ }
Original file line number Diff line number Diff line change @@ -73,8 +73,7 @@ absl::StatusOr<nlohmann::json> Var(const JsonLogic& eval,
7373 return eval.Apply (default_val.value (), data);
7474 }
7575
76- return absl::InvalidArgumentError (
77- " Var key is missing and no default value provided." );
76+ return nlohmann::json (nullptr );
7877}
7978
8079absl::StatusOr<nlohmann::json> Missing (const JsonLogic& eval,
Original file line number Diff line number Diff line change @@ -68,7 +68,8 @@ absl::StatusOr<nlohmann::json> Not(const JsonLogic& eval,
6868 if (values.is_array () && values.size () > 1 ) {
6969 return absl::InvalidArgumentError (" ! accepts only single argument." );
7070 }
71- nlohmann::json sugar = values.is_array () ? values[0 ] : values;
71+ nlohmann::json sugar =
72+ (values.is_array () && !values.empty ()) ? values[0 ] : values;
7273 absl::StatusOr<bool > res = GetBool (eval, sugar, data);
7374 if (!res.ok ()) return res.status ();
7475 return !res.value ();
@@ -80,7 +81,8 @@ absl::StatusOr<nlohmann::json> DoubleNegation(const JsonLogic& eval,
8081 if (values.is_array () && values.size () > 1 ) {
8182 return absl::InvalidArgumentError (" !! accepts only single argument." );
8283 }
83- nlohmann::json sugar = values.is_array () ? values[0 ] : values;
84+ nlohmann::json sugar =
85+ (values.is_array () && !values.empty ()) ? values[0 ] : values;
8486 return GetBool (eval, sugar, data);
8587}
8688
Original file line number Diff line number Diff line change @@ -178,6 +178,13 @@ class Number {
178178 if (rhs_val == 0 ) {
179179 return absl::InvalidArgumentError (" Modulo by zero" );
180180 }
181+ if constexpr (std::is_same_v<decltype (lhs_val), int64_t > &&
182+ std::is_same_v<decltype (rhs_val), int64_t >) {
183+ if (lhs_val == std::numeric_limits<int64_t >::min () &&
184+ rhs_val == -1 ) {
185+ return Number (int64_t {0 });
186+ }
187+ }
181188 return Number (lhs_val % rhs_val);
182189 }
183190 },
You can’t perform that action at this time.
0 commit comments