Skip to content

Commit b12697a

Browse files
committed
Fixed minor edgecases
Signed-off-by: Marcin Olko <molko@google.com>
1 parent 4e928d0 commit b12697a

5 files changed

Lines changed: 76 additions & 5 deletions

File tree

providers/flagd/src/evaluator/json_logic/BUILD

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
load("@rules_cc//cc:defs.bzl", "cc_library")
1+
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
22

33
cc_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+
)
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
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+
}

providers/flagd/src/evaluator/json_logic/data.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff 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

8079
absl::StatusOr<nlohmann::json> Missing(const JsonLogic& eval,

providers/flagd/src/evaluator/json_logic/logic.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff 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

providers/flagd/src/evaluator/json_logic/numeric.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff 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
},

0 commit comments

Comments
 (0)