@@ -46,6 +46,37 @@ openfeature::Value JsonToValue(const nlohmann::json& json_val) {
4646 return {};
4747}
4848
49+ std::optional<openfeature::FlagMetadataValue> JsonToMetadataValue (
50+ const nlohmann::json& json) {
51+ if (json.is_boolean ()) {
52+ return json.get <bool >();
53+ }
54+ if (json.is_string ()) {
55+ return json.get <std::string>();
56+ }
57+ if (json.is_number_integer ()) {
58+ return json.get <int64_t >();
59+ }
60+ if (json.is_number_float ()) {
61+ return json.get <double >();
62+ }
63+ LOG (ERROR ) << " Failed to map JSON value to openfeature::FlagMetadataValue: "
64+ << json.dump ();
65+ return std::nullopt ;
66+ }
67+
68+ void EnrichMetadata (openfeature::FlagMetadata& metadata,
69+ const nlohmann::json& metadata_json) {
70+ if (!metadata_json.is_object ()) return ;
71+ for (const auto & [key, value] : metadata_json.items ()) {
72+ std::optional<openfeature::FlagMetadataValue> metadata_value =
73+ JsonToMetadataValue (value);
74+ if (metadata_value.has_value ()) {
75+ metadata.data [key] = std::move (metadata_value.value ());
76+ }
77+ }
78+ }
79+
4980nlohmann::json ContextToJson (const openfeature::EvaluationContext& ctx) {
5081 nlohmann::json json = nlohmann::json::object ();
5182 std::optional<std::string_view> targeting_key = ctx.GetTargetingKey ();
@@ -83,27 +114,39 @@ std::unique_ptr<openfeature::ResolutionDetails<T>>
83114JsonLogicEvaluator::ResolveAny (std::string_view flag_key, T default_value,
84115 const openfeature::EvaluationContext& ctx) {
85116 std::shared_ptr<const nlohmann::json> flags = sync_->GetFlags ();
117+ std::shared_ptr<const nlohmann::json> global_metadata_json =
118+ sync_->GetMetadata ();
119+
120+ openfeature::FlagMetadata flag_metadata;
121+ if (global_metadata_json) {
122+ EnrichMetadata (flag_metadata, *global_metadata_json);
123+ }
124+
86125 if (flags == nullptr ) {
87126 return std::make_unique<openfeature::ResolutionDetails<T>>(
88127 std::move (default_value), openfeature::Reason::kError , " " ,
89- openfeature::FlagMetadata () , openfeature::ErrorCode::kParseError ,
128+ flag_metadata , openfeature::ErrorCode::kParseError ,
90129 " No flags available" );
91130 }
92131
93132 auto flag_it = flags->find (flag_key);
94133 if (flag_it == flags->end ()) {
95134 return std::make_unique<openfeature::ResolutionDetails<T>>(
96135 std::move (default_value), openfeature::Reason::kError , " " ,
97- openfeature::FlagMetadata () , openfeature::ErrorCode::kFlagNotFound ,
136+ flag_metadata , openfeature::ErrorCode::kFlagNotFound ,
98137 absl::StrCat (" flag: " , flag_key, " not found" ));
99138 }
100139
101140 const nlohmann::json& flag_config = *flag_it;
102141
142+ if (flag_config.contains (" metadata" )) {
143+ EnrichMetadata (flag_metadata, flag_config[" metadata" ]);
144+ }
145+
103146 if (flag_config[" state" ] == " DISABLED" ) {
104147 return std::make_unique<openfeature::ResolutionDetails<T>>(
105148 std::move (default_value), openfeature::Reason::kDisabled , " " ,
106- openfeature::FlagMetadata () , openfeature::ErrorCode::kFlagNotFound ,
149+ flag_metadata , openfeature::ErrorCode::kFlagNotFound ,
107150 absl::StrCat (" flag: " , flag_key, " is disabled" ));
108151 }
109152
@@ -153,7 +196,7 @@ JsonLogicEvaluator::ResolveAny(std::string_view flag_key, T default_value,
153196 if (!flag_config.contains (" defaultVariant" )) {
154197 return std::make_unique<openfeature::ResolutionDetails<T>>(
155198 std::move (default_value), openfeature::Reason::kError , " " ,
156- openfeature::FlagMetadata () , openfeature::ErrorCode::kFlagNotFound ,
199+ flag_metadata , openfeature::ErrorCode::kFlagNotFound ,
157200 absl::StrCat (" flag: " , flag_key,
158201 " doesn't have defaultVariant defined." ));
159202 }
@@ -167,7 +210,7 @@ JsonLogicEvaluator::ResolveAny(std::string_view flag_key, T default_value,
167210 if (!variants.contains (variant_name)) {
168211 return std::make_unique<openfeature::ResolutionDetails<T>>(
169212 std::move (default_value), openfeature::Reason::kError , variant_name,
170- openfeature::FlagMetadata () , openfeature::ErrorCode::kGeneral ,
213+ flag_metadata , openfeature::ErrorCode::kGeneral ,
171214 absl::StrCat (" flag: " , flag_key, " doesn't contain evaluated variant: " ,
172215 variant_name, " ." ));
173216 }
@@ -185,13 +228,12 @@ JsonLogicEvaluator::ResolveAny(std::string_view flag_key, T default_value,
185228 } catch (const nlohmann::json::exception& err) {
186229 return std::make_unique<openfeature::ResolutionDetails<T>>(
187230 std::move (default_value), openfeature::Reason::kError , variant_name,
188- openfeature::FlagMetadata (), openfeature::ErrorCode::kTypeMismatch ,
189- err.what ());
231+ flag_metadata, openfeature::ErrorCode::kTypeMismatch , err.what ());
190232 }
191233
192234 return std::make_unique<openfeature::ResolutionDetails<T>>(
193- std::move (value), reason, variant_name, openfeature::FlagMetadata () ,
194- std::nullopt , std:: nullopt );
235+ std::move (value), reason, variant_name, flag_metadata, std:: nullopt ,
236+ std::nullopt );
195237}
196238
197239std::unique_ptr<openfeature::BoolResolutionDetails>
0 commit comments