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_;