33#include < algorithm>
44#include < cmath>
55#include < cstdint>
6+ #include < limits>
7+ #include < nlohmann/json_fwd.hpp>
68#include < numeric>
9+ #include < string>
10+ #include < string_view>
711#include < type_traits>
812#include < variant>
913#include < vector>
1014
1115#include " absl/status/status.h"
16+ #include " absl/status/statusor.h"
17+ #include " providers/flagd/src/evaluator/json_logic/json_logic.h"
1218
1319namespace json_logic ::ops {
1420
@@ -258,8 +264,8 @@ absl::StatusOr<nlohmann::json> Add(const JsonLogic& eval,
258264 if (!nums_res.ok ()) return nums_res.status ();
259265 if (nums_res->empty ()) return 0 ;
260266
261- return std::accumulate (nums_res->begin () + 1 , nums_res->end (), (*nums_res)[ 0 ],
262- Number::Add)
267+ return std::accumulate (nums_res->begin () + 1 , nums_res->end (),
268+ nums_res. value ()[ 0 ], Number::Add)
263269 .ToJson ();
264270}
265271
@@ -271,10 +277,10 @@ absl::StatusOr<nlohmann::json> Subtract(const JsonLogic& eval,
271277 if (!nums_res.ok ()) return nums_res.status ();
272278
273279 if (nums_res->size () == 1 ) {
274- return Number::Sub (Number (int64_t {0 }), (* nums_res)[0 ]).ToJson ();
280+ return Number::Sub (Number (int64_t {0 }), nums_res. value ( )[0 ]).ToJson ();
275281 }
276282 if (nums_res->size () == 2 ) {
277- return Number::Sub ((* nums_res)[0 ], (* nums_res)[1 ]).ToJson ();
283+ return Number::Sub (nums_res. value ( )[0 ], nums_res. value ( )[1 ]).ToJson ();
278284 }
279285 return absl::InvalidArgumentError (
280286 " Subtract requires exactly one or two arguments" );
@@ -288,8 +294,8 @@ absl::StatusOr<nlohmann::json> Multiply(const JsonLogic& eval,
288294 if (!nums_res.ok ()) return nums_res.status ();
289295 if (nums_res->empty ()) return 1 ;
290296
291- return std::accumulate (nums_res->begin () + 1 , nums_res->end (), (*nums_res)[ 0 ],
292- Number::Mul)
297+ return std::accumulate (nums_res->begin () + 1 , nums_res->end (),
298+ nums_res. value ()[ 0 ], Number::Mul)
293299 .ToJson ();
294300}
295301
@@ -304,7 +310,7 @@ absl::StatusOr<nlohmann::json> Divide(const JsonLogic& eval,
304310 }
305311
306312 absl::StatusOr<Number> result_res =
307- Number::Div ((* nums_res)[0 ], (* nums_res)[1 ]);
313+ Number::Div (nums_res. value ( )[0 ], nums_res. value ( )[1 ]);
308314 if (!result_res.ok ()) return result_res.status ();
309315 return result_res->ToJson ();
310316}
@@ -320,7 +326,7 @@ absl::StatusOr<nlohmann::json> Modulo(const JsonLogic& eval,
320326 }
321327
322328 absl::StatusOr<Number> result_res =
323- Number::Mod ((* nums_res)[0 ], (* nums_res)[1 ]);
329+ Number::Mod (nums_res. value ( )[0 ], nums_res. value ( )[1 ]);
324330 if (!result_res.ok ()) return result_res.status ();
325331 return result_res->ToJson ();
326332}
@@ -332,9 +338,10 @@ absl::StatusOr<nlohmann::json> LessThan(const JsonLogic& eval,
332338 GetNumbers (eval, values, data, " <" );
333339 if (!nums_res.ok ()) return nums_res.status ();
334340
335- if (nums_res->size () == 2 ) return (* nums_res)[0 ] < (* nums_res)[1 ];
341+ if (nums_res->size () == 2 ) return nums_res. value ( )[0 ] < nums_res. value ( )[1 ];
336342 if (nums_res->size () == 3 ) {
337- return (*nums_res)[0 ] < (*nums_res)[1 ] && (*nums_res)[1 ] < (*nums_res)[2 ];
343+ return nums_res.value ()[0 ] < nums_res.value ()[1 ] &&
344+ nums_res.value ()[1 ] < nums_res.value ()[2 ];
338345 }
339346 return absl::InvalidArgumentError (" Comparison requires 2 or 3 arguments" );
340347}
@@ -349,10 +356,12 @@ absl::StatusOr<nlohmann::json> LessThanOrEqual(const JsonLogic& eval,
349356 auto is_lte = [](const Number& first, const Number& second) {
350357 return first < second || first == second;
351358 };
352- if (nums_res->size () == 2 ) return is_lte ((*nums_res)[0 ], (*nums_res)[1 ]);
359+ if (nums_res->size () == 2 ) {
360+ return is_lte (nums_res.value ()[0 ], nums_res.value ()[1 ]);
361+ }
353362 if (nums_res->size () == 3 ) {
354- return is_lte ((* nums_res)[0 ], (* nums_res)[1 ]) &&
355- is_lte ((* nums_res)[1 ], (* nums_res)[2 ]);
363+ return is_lte (nums_res. value ( )[0 ], nums_res. value ( )[1 ]) &&
364+ is_lte (nums_res. value ( )[1 ], nums_res. value ( )[2 ]);
356365 }
357366 return absl::InvalidArgumentError (" Comparison requires 2 or 3 arguments" );
358367}
@@ -364,7 +373,7 @@ absl::StatusOr<nlohmann::json> GreaterThan(const JsonLogic& eval,
364373 GetNumbers (eval, values, data, " >" );
365374 if (!nums_res.ok ()) return nums_res.status ();
366375
367- if (nums_res->size () == 2 ) return (* nums_res)[1 ] < (* nums_res)[0 ];
376+ if (nums_res->size () == 2 ) return nums_res. value ( )[1 ] < nums_res. value ( )[0 ];
368377 return absl::InvalidArgumentError (" GreaterThan requires 2 arguments" );
369378}
370379
@@ -376,7 +385,8 @@ absl::StatusOr<nlohmann::json> GreaterThanOrEqual(const JsonLogic& eval,
376385 if (!nums_res.ok ()) return nums_res.status ();
377386
378387 if (nums_res->size () == 2 ) {
379- return (*nums_res)[1 ] < (*nums_res)[0 ] || (*nums_res)[0 ] == (*nums_res)[1 ];
388+ return nums_res.value ()[1 ] < nums_res.value ()[0 ] ||
389+ nums_res.value ()[0 ] == nums_res.value ()[1 ];
380390 }
381391 return absl::InvalidArgumentError (" GreaterThanOrEqual requires 2 arguments" );
382392}
0 commit comments