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/hexpiretime_reply.hpp>
17#include <userver/storages/redis/hpexpiretime_reply.hpp>
18#include <userver/storages/redis/pttl_reply.hpp>
19#include <userver/storages/redis/reply_types.hpp>
20#include <userver/storages/redis/ttl_reply.hpp>
22USERVER_NAMESPACE_BEGIN
24namespace storages::
redis {
27ReplyData&& ExtractData(ReplyPtr& reply);
29template <
typename Result,
typename ReplyType = Result>
30concept HasParseFunctionFromRedisReply =
requires {
32 Result::Parse(std::declval<ReplyData>(), std::declval<
const std::string&>())
33 } -> std::same_as<ReplyType>;
36bool IsNil(
const ReplyData& reply_data);
38void ExpectIsOk(
const ReplyPtr& reply,
const std::string& request_description);
40void ExpectArray(
const ReplyData& reply_data,
const std::string& request_description);
42const std::string& RequestDescription(
const ReplyPtr& reply,
const std::string& request_description);
48template <
typename Result,
typename ReplyType = Result>
51std::vector<std::string>
52ParseReplyDataArray(ReplyData&& array_data,
const std::string& request_description,
To<std::vector<std::string>>);
55ParseReplyDataArray(ReplyData&& array_data,
const std::string& request_description,
To<std::vector<int64_t>>);
58 vector<std::optional<std::string>>
59 ParseReplyDataArray(ReplyData&& array_data,
const std::string& request_description,
To<std::vector<std::optional<std::string>>>);
61std::vector<std::pair<std::string, std::string>>
62ParseReplyDataArray(ReplyData&& array_data,
const std::string& request_description,
To<std::vector<std::pair<std::string, std::string>>>);
64std::vector<MemberScore>
65ParseReplyDataArray(ReplyData&& array_data,
const std::string& request_description,
To<std::vector<MemberScore>>);
68ParseReplyDataArray(ReplyData&& array_data,
const std::string& request_description,
To<std::vector<GeoPoint>>);
71ParseReplyDataArray(ReplyData&& array_data,
const std::string& request_description,
To<std::vector<
HexpireReply>>);
74ParseReplyDataArray(ReplyData&& array_data,
const std::string& request_description,
To<std::vector<
HpersistReply>>);
77ParseReplyDataArray(ReplyData&& array_data,
const std::string& request_description,
To<std::vector<TtlReply>>);
80ParseReplyDataArray(ReplyData&& array_data,
const std::string& request_description,
To<std::vector<PttlReply>>);
82std::vector<HexpiretimeReply>
83ParseReplyDataArray(ReplyData&& array_data,
const std::string& request_description,
To<std::vector<HexpiretimeReply>>);
85std::vector<HpexpiretimeReply>
86ParseReplyDataArray(ReplyData&& array_data,
const std::string& request_description,
To<std::vector<HpexpiretimeReply>>);
89 vector<std::optional<
Point>>
90 ParseReplyDataArray(ReplyData&& array_data,
const std::string& request_description,
To<std::vector<std::optional<
Point>>>);
92std::string Parse(ReplyData&& reply_data,
const std::string& request_description,
To<std::string>);
94double Parse(ReplyData&& reply_data,
const std::string& request_description,
To<
double>);
96size_t Parse(ReplyData&& reply_data,
const std::string& request_description,
To<size_t>);
98bool Parse(ReplyData&& reply_data,
const std::string& request_description,
To<size_t,
bool>);
100int64_t Parse(ReplyData&& reply_data,
const std::string& request_description,
To<int64_t>);
102std::chrono::system_clock::time_point
103Parse(ReplyData&& reply_data,
const std::string& request_description,
To<std::chrono::system_clock::time_point>);
105HsetReply Parse(ReplyData&& reply_data,
const std::string& request_description,
To<HsetReply>);
111PersistReply Parse(ReplyData&& reply_data,
const std::string& request_description,
To<PersistReply>);
117KeyType Parse(ReplyData&& reply_data,
const std::string& request_description,
To<
KeyType>);
119void Parse(ReplyData&& reply_data,
const std::string& request_description,
To<StatusOk,
void>);
121bool Parse(ReplyData&& reply_data,
const std::string& request_description,
To<std::optional<StatusOk>,
bool>);
123void Parse(ReplyData&& reply_data,
const std::string& request_description,
To<StatusPong,
void>);
125Point Parse(ReplyData&& reply_data,
const std::string& request_description,
To<
Point>);
127SetReply Parse(ReplyData&& reply_data,
const std::string& request_description,
To<SetReply>);
129std::unordered_set<std::string>
130Parse(ReplyData&& reply_data,
const std::string& request_description,
To<std::unordered_set<std::string>>);
132std::unordered_map<std::string, std::string>
133Parse(ReplyData&& reply_data,
const std::string& request_description,
To<std::unordered_map<std::string, std::string>>);
135ReplyData Parse(ReplyData&& reply_data,
const std::string& request_description,
To<ReplyData>);
137formats::
json::
Value Parse(ReplyData&& reply_data,
const std::string& request_description,
To<formats::
json::
Value>);
139std::vector<std::optional<formats::
json::
Value>>
140ParseReplyDataArray(ReplyData&& array_data,
const std::string& request_description,
To<std::vector<std::optional<formats::
json::
Value>>>);
142template <
typename Result,
typename ReplyType = Result>
143requires impl::HasParseFunctionFromRedisReply<Result, ReplyType>
144ReplyType Parse(ReplyData&& reply_data,
const std::string& request_description,
To<Result, ReplyType>) {
145 return Result::Parse(std::move(reply_data), request_description);
149std::vector<T> Parse(ReplyData&& reply_data,
const std::string& request_description,
To<std::vector<T>>) {
150 impl::ExpectArray(reply_data, request_description);
151 return ParseReplyDataArray(std::move(reply_data), request_description,
To<std::vector<T>>{});
155std::optional<T> Parse(ReplyData&& reply_data,
const std::string& request_description,
To<std::optional<T>>) {
156 if (impl::IsNil(reply_data)) {
159 return Parse(std::move(reply_data), request_description,
To<T>{});
164template <
typename Result,
typename ReplyType = Result>
165ReplyType ParseReply(ReplyPtr reply,
const std::string& request_description = {}) {
166 const auto& description = impl::RequestDescription(reply, request_description);
167 impl::ExpectIsOk(reply, description);
168 return Parse(impl::ExtractData(reply), description,
To<Result, ReplyType>{});