Skip to content

Commit df91388

Browse files
committed
fix: Ensure that serialization of a variation or rollout uses the correct overload.
1 parent daf22cf commit df91388

4 files changed

Lines changed: 20 additions & 6 deletions

File tree

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77

88
namespace launchdarkly {
99

10+
struct VariationOrRolloutContext {};
11+
12+
1013
tl::expected<std::optional<data_model::Flag::Rollout>, JsonError> tag_invoke(
1114
boost::json::value_to_tag<
1215
tl::expected<std::optional<data_model::Flag::Rollout>,
@@ -72,7 +75,7 @@ void tag_invoke(boost::json::value_from_tag const& unused,
7275
void tag_invoke(
7376
boost::json::value_from_tag const& unused,
7477
boost::json::value& json_value,
75-
data_model::Flag::VariationOrRollout const& variation_or_rollout);
78+
data_model::Flag::VariationOrRollout const& variation_or_rollout, const VariationOrRolloutContext&);
7679

7780
void tag_invoke(
7881
boost::json::value_from_tag const& unused,

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,16 @@ void WriteMinimal(boost::json::object& obj,
189189
}
190190
}
191191

192+
template <typename T, typename C>
193+
void WriteMinimal(boost::json::object& obj,
194+
std::string const& key,
195+
T const& val,
196+
std::function<bool()> const& predicate, const C &c) {
197+
if (predicate()) {
198+
obj.emplace(key, boost::json::value_from(val, c));
199+
}
200+
}
201+
192202
void WriteMinimal(boost::json::object& obj,
193203
std::string const& key, // No copy when not used.
194204
bool val);

libs/internal/src/serialization/json_flag.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ void tag_invoke(boost::json::value_from_tag const& unused,
255255
void tag_invoke(
256256
boost::json::value_from_tag const& unused,
257257
boost::json::value& json_value,
258-
data_model::Flag::VariationOrRollout const& variation_or_rollout) {
258+
data_model::Flag::VariationOrRollout const& variation_or_rollout, const VariationOrRolloutContext&) {
259259
auto& obj = json_value.emplace_object();
260260
std::visit(
261261
[&obj](auto&& arg) {
@@ -364,7 +364,7 @@ void tag_invoke(boost::json::value_from_tag const& unused,
364364
}
365365
},
366366
flag.fallthrough);
367-
});
367+
}, VariationOrRolloutContext());
368368
WriteMinimal(obj, "clientSideAvailability", flag.clientSideAvailability,
369369
[&]() {
370370
return flag.clientSideAvailability.usingEnvironmentId ||

libs/internal/tests/data_model_serialization_test.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ TEST(RolloutTests, SerializeAllFields) {
423423
TEST(VariationOrRolloutTests, SerializeVariation) {
424424
data_model::Flag::VariationOrRollout variation = 5;
425425

426-
auto json = boost::json::value_from(variation);
426+
auto json = boost::json::value_from(variation, VariationOrRolloutContext());
427427

428428
auto expected = boost::json::parse(R"({"variation":5})");
429429
EXPECT_EQ(expected, json);
@@ -438,8 +438,9 @@ TEST(VariationOrRolloutTests, SerializeRollout) {
438438
rollout.seed = 42;
439439
rollout.variations = {
440440
data_model::Flag::Rollout::WeightedVariation::Untracked(1, 2), {3, 4}};
441-
data_model::Flag::VariationOrRollout var_or_roll = rollout;
442-
auto json = boost::json::value_from(var_or_roll);
441+
data_model::Flag::VariationOrRollout var_or_roll;
442+
var_or_roll.emplace<Rollout>(rollout);
443+
auto json = boost::json::value_from(var_or_roll, VariationOrRolloutContext());
443444

444445
auto expected = boost::json::parse(R"({
445446
"rollout":{

0 commit comments

Comments
 (0)