3 #include "../../../include/launchdarkly/server_side/integrations/data_reader/kinds.hpp"
4 #include "../../data_interfaces/source/idata_reader.hpp"
6 #include <launchdarkly/logging/logger.hpp>
7 #include <launchdarkly/serialization/value_mapping.hpp>
8 #include <launchdarkly/server_side/integrations/data_reader/iserialized_data_reader.hpp>
12 namespace launchdarkly {
14 tl::expected<std::optional<data_model::Tombstone>, JsonError> tag_invoke(
15 boost::json::value_to_tag<tl::expected<std::optional<data_model::Tombstone>,
16 JsonError>>
const& unused,
17 boost::json::value
const& json_value);
20 namespace launchdarkly::server_side::data_components {
26 std::shared_ptr<integrations::ISerializedDataReader> reader);
28 [[nodiscard]] SingleResult<data_model::Flag>
GetFlag(
29 std::string
const& key)
const override;
31 [[nodiscard]] SingleResult<data_model::Segment>
GetSegment(
32 std::string
const& key)
const override;
34 [[nodiscard]] CollectionResult<data_model::Flag>
AllFlags()
const override;
36 [[nodiscard]] CollectionResult<data_model::Segment>
AllSegments()
39 [[nodiscard]] std::string
const&
Identity()
const override;
44 template <
typename Item>
45 static tl::expected<data_model::ItemDescriptor<Item>,
46 data_interfaces::IDataReader::Error>
47 DeserializeJsonDescriptor(
50 return data_model::ItemDescriptor<Item>(
51 data_model::Tombstone(descriptor.version));
54 auto const json_val = boost::json::parse(descriptor.serializedItem);
56 if (
auto item_result = boost::json::value_to<
57 tl::expected<std::optional<Item>, JsonError>>(json_val)) {
58 auto item = *item_result;
60 return tl::make_unexpected(
"item invalid: value is null");
62 return data_model::ItemDescriptor<Item>(std::move(*item));
65 auto tombstone = boost::json::value_to<
66 tl::expected<std::optional<data_model::Tombstone>, JsonError>>(
69 return tl::make_unexpected(ErrorToString(tombstone.error()));
71 auto tombstone_result = *tombstone;
72 if (!tombstone_result) {
73 return tl::make_unexpected(
"tombstone invalid: value is null");
75 return data_model::ItemDescriptor<Item>(*tombstone_result);
78 template <
typename DataModel,
typename DataKind>
79 SingleResult<DataModel> DeserializeSingle(DataKind
const& kind,
80 std::string
const& key)
const {
81 auto result = source_->Get(kind, key);
85 return tl::make_unexpected(result.error().message);
88 auto serialized_item = *result;
90 if (!serialized_item) {
94 return DeserializeJsonDescriptor<DataModel>(*serialized_item);
97 template <
typename DataModel,
typename DataKind>
98 CollectionResult<DataModel> DeserializeCollection(
99 DataKind
const& kind)
const {
100 auto result = source_->All(kind);
104 return tl::make_unexpected(result.error().message);
107 Collection<DataModel> items;
109 for (
auto const& [key, descriptor] : *result) {
110 auto item = DeserializeJsonDescriptor<DataModel>(descriptor);
113 LD_LOG(logger_, LogLevel::kError)
114 <<
"failed to deserialize " << key <<
" while fetching all "
115 << kind.Namespace() <<
": " << item.error();
119 items.emplace(key, *item);
124 Logger
const& logger_;
127 std::shared_ptr<integrations::ISerializedDataReader> source_;
128 std::string
const identity_;
Definition: json_deserializer.hpp:22
SingleResult< data_model::Segment > GetSegment(std::string const &key) const override
Attempts to get a segment named by key.
Definition: json_deserializer.cpp:52
CollectionResult< data_model::Segment > AllSegments() const override
Attempts to get a collection of all segments.
Definition: json_deserializer.cpp:62
bool Initialized() const override
Definition: json_deserializer.cpp:70
std::string const & Identity() const override
Definition: json_deserializer.cpp:66
SingleResult< data_model::Flag > GetFlag(std::string const &key) const override
Attempts to get a flag named by key.
Definition: json_deserializer.cpp:47
CollectionResult< data_model::Flag > AllFlags() const override
Attempts to get a collection of all flags.
Definition: json_deserializer.cpp:57
IDataReader obtains data on-demand. Calls to obtain data may fail, so the getter methods use tl::expe...
Definition: idata_reader.hpp:21
Definition: serialized_item_descriptor.hpp:12
bool deleted
Definition: serialized_item_descriptor.hpp:21