9#include <unordered_map>
10#include <unordered_set>
13#include <userver/formats/json/value.hpp>
14#include <userver/storages/redis/fwd.hpp>
16#include <userver/storages/redis/reply_types.hpp>
18USERVER_NAMESPACE_BEGIN
20namespace storages::
redis {
23ReplyData&& ExtractData(ReplyPtr& reply);
25template <
typename Result,
typename ReplyType = Result>
26concept HasParseFunctionFromRedisReply =
requires {
28 Result::Parse(std::declval<ReplyData>(), std::declval<
const std::string&>())
29 } -> std::same_as<ReplyType>;
32bool IsNil(
const ReplyData& reply_data);
34void ExpectIsOk(
const ReplyPtr& reply,
const std::string& request_description);
36void ExpectArray(
const ReplyData& reply_data,
const std::string& request_description);
38const std::string& RequestDescription(
const ReplyPtr& reply,
const std::string& request_description);
44template <
typename Result,
typename ReplyType = Result>
47std::vector<std::string>
48ParseReplyDataArray(ReplyData&& array_data,
const std::string& request_description,
To<std::vector<std::string>>);
51 vector<std::optional<std::string>>
52 ParseReplyDataArray(ReplyData&& array_data,
const std::string& request_description,
To<std::vector<std::optional<std::string>>>);
54std::vector<std::pair<std::string, std::string>>
55ParseReplyDataArray(ReplyData&& array_data,
const std::string& request_description,
To<std::vector<std::pair<std::string, std::string>>>);
57std::vector<MemberScore>
58ParseReplyDataArray(ReplyData&& array_data,
const std::string& request_description,
To<std::vector<MemberScore>>);
61ParseReplyDataArray(ReplyData&& array_data,
const std::string& request_description,
To<std::vector<GeoPoint>>);
64 vector<std::optional<
Point>>
65 ParseReplyDataArray(ReplyData&& array_data,
const std::string& request_description,
To<std::vector<std::optional<
Point>>>);
67std::string Parse(ReplyData&& reply_data,
const std::string& request_description,
To<std::string>);
69double Parse(ReplyData&& reply_data,
const std::string& request_description,
To<
double>);
71size_t Parse(ReplyData&& reply_data,
const std::string& request_description,
To<size_t>);
73bool Parse(ReplyData&& reply_data,
const std::string& request_description,
To<size_t,
bool>);
75int64_t Parse(ReplyData&& reply_data,
const std::string& request_description,
To<int64_t>);
77std::chrono::system_clock::time_point
78Parse(ReplyData&& reply_data,
const std::string& request_description,
To<std::chrono::system_clock::time_point>);
80HsetReply Parse(ReplyData&& reply_data,
const std::string& request_description,
To<HsetReply>);
82PersistReply Parse(ReplyData&& reply_data,
const std::string& request_description,
To<PersistReply>);
84KeyType Parse(ReplyData&& reply_data,
const std::string& request_description,
To<
KeyType>);
86void Parse(ReplyData&& reply_data,
const std::string& request_description,
To<StatusOk,
void>);
88bool Parse(ReplyData&& reply_data,
const std::string& request_description,
To<std::optional<StatusOk>,
bool>);
90void Parse(ReplyData&& reply_data,
const std::string& request_description,
To<StatusPong,
void>);
92Point Parse(ReplyData&& reply_data,
const std::string& request_description,
To<
Point>);
94SetReply Parse(ReplyData&& reply_data,
const std::string& request_description,
To<SetReply>);
96std::unordered_set<std::string>
97Parse(ReplyData&& reply_data,
const std::string& request_description,
To<std::unordered_set<std::string>>);
99std::unordered_map<std::string, std::string>
100Parse(ReplyData&& reply_data,
const std::string& request_description,
To<std::unordered_map<std::string, std::string>>);
102ReplyData Parse(ReplyData&& reply_data,
const std::string& request_description,
To<ReplyData>);
104formats::json::
Value Parse(ReplyData&& reply_data,
const std::string& request_description,
To<formats::json::
Value>);
106std::vector<std::optional<formats::json::
Value>>
107ParseReplyDataArray(ReplyData&& array_data,
const std::string& request_description,
To<std::vector<std::optional<formats::json::
Value>>>);
109template <
typename Result,
typename ReplyType = Result>
110requires impl::HasParseFunctionFromRedisReply<Result, ReplyType>
111ReplyType Parse(ReplyData&& reply_data,
const std::string& request_description,
To<Result, ReplyType>) {
112 return Result::Parse(std::move(reply_data), request_description);
116std::vector<T> Parse(ReplyData&& reply_data,
const std::string& request_description,
To<std::vector<T>>) {
117 impl::ExpectArray(reply_data, request_description);
118 return ParseReplyDataArray(std::move(reply_data), request_description,
To<std::vector<T>>{});
122std::optional<T> Parse(ReplyData&& reply_data,
const std::string& request_description,
To<std::optional<T>>) {
123 if (impl::IsNil(reply_data)) {
126 return Parse(std::move(reply_data), request_description,
To<T>{});
131template <
typename Result,
typename ReplyType = Result>
132ReplyType ParseReply(ReplyPtr reply,
const std::string& request_description = {}) {
133 const auto& description = impl::RequestDescription(reply, request_description);
134 impl::ExpectIsOk(reply, description);
135 return Parse(impl::ExtractData(reply), description,
To<Result, ReplyType>{});