Skip to content

Commit 0afa605

Browse files
committed
feat: serialize prerequisites in EvaluationResult
1 parent 9ad1581 commit 0afa605

File tree

5 files changed

+64
-17
lines changed

5 files changed

+64
-17
lines changed

libs/client-sdk/src/data_sources/data_source_event_handler.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
#include "data_source_event_handler.hpp"
22

3+
#include <launchdarkly/detail/serialization/json_primitives.hpp>
34
#include <launchdarkly/encoding/base_64.hpp>
45
#include <launchdarkly/serialization/json_evaluation_result.hpp>
56
#include <launchdarkly/serialization/json_item_descriptor.hpp>
6-
#include <launchdarkly/detail/serialization/json_primitives.hpp>
77
#include <launchdarkly/serialization/value_mapping.hpp>
88

99
#include <boost/core/ignore_unused.hpp>
@@ -12,7 +12,7 @@
1212

1313
#include <utility>
1414

15-
#include "tl/expected.hpp"
15+
#include <tl/expected.hpp>
1616

1717
namespace launchdarkly::client_side::data_sources {
1818

@@ -76,10 +76,10 @@ DataSourceEventHandler::DataSourceEventHandler(
7676
IDataSourceUpdateSink& handler,
7777
Logger const& logger,
7878
DataSourceStatusManager& status_manager)
79-
: context_(context),
80-
handler_(handler),
79+
: handler_(handler),
8180
logger_(logger),
82-
status_manager_(status_manager) {}
81+
status_manager_(status_manager),
82+
context_(context) {}
8383

8484
DataSourceEventHandler::MessageStatus DataSourceEventHandler::HandleMessage(
8585
std::string const& type,

libs/common/include/launchdarkly/data/evaluation_result.hpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ class EvaluationResult {
4848
*/
4949
[[nodiscard]] EvaluationDetailInternal const& Detail() const;
5050

51-
[[nodiscard]] std::vector<std::string> const& Prerequisites() const;
51+
[[nodiscard]] std::optional<std::vector<std::string>> const& Prerequisites()
52+
const;
5253

5354
EvaluationResult(
5455
uint64_t version,
@@ -59,6 +60,16 @@ class EvaluationResult {
5960
debug_events_until_date,
6061
EvaluationDetailInternal detail);
6162

63+
EvaluationResult(
64+
uint64_t version,
65+
std::optional<uint64_t> flag_version,
66+
bool track_events,
67+
bool track_reason,
68+
std::optional<std::chrono::time_point<std::chrono::system_clock>>
69+
debug_events_until_date,
70+
EvaluationDetailInternal detail,
71+
std::optional<std::vector<std::string>> prerequisites);
72+
6273
private:
6374
uint64_t version_;
6475
std::optional<uint64_t> flag_version_;
@@ -67,7 +78,7 @@ class EvaluationResult {
6778
std::optional<std::chrono::time_point<std::chrono::system_clock>>
6879
debug_events_until_date_;
6980
EvaluationDetailInternal detail_;
70-
std::vector<std::string> prerequisites_;
81+
std::optional<std::vector<std::string>> prerequisites_;
7182
};
7283

7384
std::ostream& operator<<(std::ostream& out, EvaluationResult const& result);

libs/common/src/data/evaluation_result.cpp

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ EvaluationDetailInternal const& EvaluationResult::Detail() const {
3131
return detail_;
3232
}
3333

34-
std::vector<std::string> const& EvaluationResult::Prerequisites() const {
34+
std::optional<std::vector<std::string>> const& EvaluationResult::Prerequisites()
35+
const {
3536
return prerequisites_;
3637
}
3738

@@ -43,12 +44,30 @@ EvaluationResult::EvaluationResult(
4344
std::optional<std::chrono::time_point<std::chrono::system_clock>>
4445
debug_events_until_date,
4546
EvaluationDetailInternal detail)
47+
: EvaluationResult(version,
48+
flag_version,
49+
track_events,
50+
track_reason,
51+
debug_events_until_date,
52+
std::move(detail),
53+
{}) {}
54+
55+
EvaluationResult::EvaluationResult(
56+
uint64_t version,
57+
std::optional<uint64_t> flag_version,
58+
bool track_events,
59+
bool track_reason,
60+
std::optional<std::chrono::time_point<std::chrono::system_clock>>
61+
debug_events_until_date,
62+
EvaluationDetailInternal detail,
63+
std::optional<std::vector<std::string>> prerequisites)
4664
: version_(version),
4765
flag_version_(flag_version),
4866
track_events_(track_events),
4967
track_reason_(track_reason),
5068
debug_events_until_date_(debug_events_until_date),
51-
detail_(std::move(detail)) {}
69+
detail_(std::move(detail)),
70+
prerequisites_(std::move(prerequisites)) {}
5271

5372
std::ostream& operator<<(std::ostream& out, EvaluationResult const& result) {
5473
out << "{";
@@ -63,11 +82,11 @@ std::ostream& operator<<(std::ostream& out, EvaluationResult const& result) {
6382
<< std::put_time(std::gmtime(&as_time_t), "%Y-%m-%d %H:%M:%S");
6483
}
6584
out << " detail: " << result.Detail();
66-
if (result.Prerequisites().size() > 0) {
85+
if (auto const prerequisites = result.Prerequisites()) {
6786
out << " prerequisites: [";
68-
for (std::size_t i = 0; i < result.Prerequisites().size(); i++) {
69-
out << result.Prerequisites()[i]
70-
<< (i == result.Prerequisites().size() - 1 ? "" : ", ");
87+
for (std::size_t i = 0; i < prerequisites->size(); i++) {
88+
out << prerequisites->at(i)
89+
<< (i == prerequisites->size() - 1 ? "" : ", ");
7190
}
7291
out << "]";
7392
}

libs/internal/include/launchdarkly/serialization/value_mapping.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,11 @@ template <>
136136
std::optional<uint64_t> ValueAsOpt(boost::json::object::const_iterator iterator,
137137
boost::json::object::const_iterator end);
138138

139+
template <>
140+
std::optional<std::vector<std::string>> ValueAsOpt(
141+
boost::json::object::const_iterator iterator,
142+
boost::json::object::const_iterator end);
143+
139144
template <>
140145
std::optional<std::string> ValueAsOpt(
141146
boost::json::object::const_iterator iterator,

libs/internal/src/serialization/json_evaluation_result.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include <launchdarkly/detail/serialization/json_errors.hpp>
2+
#include <launchdarkly/detail/serialization/json_value.hpp>
23
#include <launchdarkly/serialization/json_evaluation_reason.hpp>
34
#include <launchdarkly/serialization/json_evaluation_result.hpp>
4-
#include <launchdarkly/detail/serialization/json_value.hpp>
55
#include <launchdarkly/serialization/value_mapping.hpp>
66

77
#include <boost/core/ignore_unused.hpp>
@@ -50,6 +50,10 @@ tl::expected<std::optional<EvaluationResult>, JsonError> tag_invoke(
5050
std::chrono::milliseconds{value}};
5151
});
5252

53+
auto* prerequisites_iter = json_obj.find("prerequisites");
54+
auto prerequisites = ValueAsOpt<std::vector<std::string>>(
55+
prerequisites_iter, json_obj.end());
56+
5357
// Evaluation detail is directly de-serialized inline here.
5458
// This is because the shape of the evaluation detail is different
5559
// when deserializing FlagMeta. Primarily `variation` not
@@ -105,7 +109,8 @@ tl::expected<std::optional<EvaluationResult>, JsonError> tag_invoke(
105109
track_events,
106110
track_reason,
107111
debug_events_until_date,
108-
EvaluationDetailInternal(std::move(value), variation, std::nullopt)};
112+
EvaluationDetailInternal(std::move(value), variation, std::nullopt),
113+
prerequisites};
109114
}
110115

111116
void tag_invoke(boost::json::value_from_tag const& unused,
@@ -133,7 +138,14 @@ void tag_invoke(boost::json::value_from_tag const& unused,
133138
"debugEventsUntilDate",
134139
std::chrono::duration_cast<std::chrono::milliseconds>(
135140
evaluation_result.DebugEventsUntilDate()->time_since_epoch())
136-
.count());
141+
.count());
142+
}
143+
144+
if (auto const prerequisites = evaluation_result.Prerequisites()) {
145+
if (!prerequisites->empty()) {
146+
obj.emplace("prerequisites",
147+
boost::json::value_from(prerequisites.value()));
148+
}
137149
}
138150

139151
auto& detail = evaluation_result.Detail();
@@ -149,4 +161,4 @@ void tag_invoke(boost::json::value_from_tag const& unused,
149161
obj.emplace("reason", reason_json);
150162
}
151163
}
152-
} // namespace launchdarkly
164+
} // namespace launchdarkly

0 commit comments

Comments
 (0)