9#include <userver/cache/update_type.hpp>
10#include <userver/utils/meta.hpp>
12USERVER_NAMESPACE_BEGIN
22namespace mongo_cache::impl {
25concept HasCollectionsField =
requires { T::kMongoCollectionsField; };
28concept HasUpdateFieldName =
requires { T::kMongoUpdateFieldName; };
31concept HasKeyField =
requires { T::kKeyField; };
34concept HasValidDataType = meta::
kIsMap<
typename T::DataType>;
37concept HasSecondaryPreferred =
requires { T::kIsSecondaryPreferred; };
40concept HasDeserializeObject =
requires { T::DeserializeObject; };
43concept HasCorrectDeserializeObject =
requires(
const T& t,
const formats::
bson::
Document& doc) {
45 t.DeserializeObject(doc)
46 } -> std::same_as<
typename T::ObjectType>;
50concept HasDefaultDeserializeObject =
requires { T::kUseDefaultDeserializeObject; };
53concept HasFindOperation =
requires { T::GetFindOperation; };
56concept HasCorrectFindOperation =
requires(
58 cache::UpdateType update_type,
59 const std::chrono::system_clock::time_point& last_update,
60 const std::chrono::system_clock::time_point& now,
61 const std::chrono::system_clock::duration& correction
65 t.GetFindOperation(update_type, last_update, now, correction)
70concept HasDefaultFindOperation =
requires { T::kUseDefaultFindOperation; };
78concept HasFindOperationInTraits = HasFindOperation<T> || HasDefaultFindOperation<T>;
81concept HasInvalidDocumentsSkipped =
requires { T::kAreInvalidDocumentsSkipped; };
84struct ClassByMemberPointer {};
85template <
typename T,
typename C>
86struct ClassByMemberPointer<T C::*> {
89template <
typename CollectionPtr>
90using CollectionsType =
typename ClassByMemberPointer<std::remove_cv_t<CollectionPtr>>::type;
92template <
typename MongoCacheTraits>
95 if constexpr (HasDefaultDeserializeObject<MongoCacheTraits>) {
97 std::is_same_v<std::decay_t<
decltype(MongoCacheTraits::kUseDefaultDeserializeObject)>,
bool>,
98 "Mongo cache traits must specify kUseDefaultDeserializeObject as "
102 if constexpr (HasDefaultFindOperation<MongoCacheTraits>) {
104 std::is_same_v<std::decay_t<
decltype(MongoCacheTraits::kUseDefaultFindOperation)>,
bool>,
105 "Mongo cache traits must specify kUseDefaultFindOperation as bool"
110 static_assert(HasCollectionsField<MongoCacheTraits>,
"Mongo cache traits must specify collections field");
111 static_assert(HasKeyField<MongoCacheTraits>,
"Mongo cache traits must specify key field");
112 static_assert(HasValidDataType<MongoCacheTraits>,
"Mongo cache traits must specify mapping data type");
114 static_assert(HasSecondaryPreferred<MongoCacheTraits>,
"Mongo cache traits must specify read preference");
116 std::is_same_v<std::decay_t<
decltype(MongoCacheTraits::kIsSecondaryPreferred)>,
bool>,
117 "Mongo cache traits must specify read preference of a bool type"
120 static_assert(HasInvalidDocumentsSkipped<MongoCacheTraits>,
"Mongo cache traits must specify validation policy");
122 std::is_same_v<std::decay_t<
decltype(MongoCacheTraits::kAreInvalidDocumentsSkipped)>,
bool>,
123 "Mongo cache traits must specify validation policy of a bool type"
127 !HasFindOperation<MongoCacheTraits> || HasCorrectFindOperation<MongoCacheTraits>,
128 "Mongo cache traits must specify find operation with correct "
129 "signature and return value type: "
130 "static storages::mongo::operations::Find GetFindOperation("
131 "cache::UpdateType type, "
132 "const std::chrono::system_clock::time_point& last_update, "
133 "const std::chrono::system_clock::time_point& now, "
134 "const std::chrono::system_clock::duration& correction)"
138 HasDeserializeObject<MongoCacheTraits> || HasDefaultDeserializeObject<MongoCacheTraits>,
139 "Mongo cache traits must specify deserialize object"
142 !HasDeserializeObject<MongoCacheTraits> || HasCorrectDeserializeObject<MongoCacheTraits>,
143 "Mongo cache traits must specify deserialize object with correct "
144 "signature and return value type: "
145 "static ObjectType DeserializeObject(const formats::bson::Document& "