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>);
109PersistReply Parse(ReplyData&& reply_data,
const std::string& request_description,
To<PersistReply>);
115KeyType Parse(ReplyData&& reply_data,
const std::string& request_description,
To<
KeyType>);
117void Parse(ReplyData&& reply_data,
const std::string& request_description,
To<StatusOk,
void>);
119bool Parse(ReplyData&& reply_data,
const std::string& request_description,
To<std::optional<StatusOk>,
bool>);
121void Parse(ReplyData&& reply_data,
const std::string& request_description,
To<StatusPong,
void>);
123Point Parse(ReplyData&& reply_data,
const std::string& request_description,
To<
Point>);
125SetReply Parse(ReplyData&& reply_data,
const std::string& request_description,
To<SetReply>);
127std::unordered_set<std::string>
128Parse(ReplyData&& reply_data,
const std::string& request_description,
To<std::unordered_set<std::string>>);
130std::unordered_map<std::string, std::string>
131Parse(ReplyData&& reply_data,
const std::string& request_description,
To<std::unordered_map<std::string, std::string>>);
133ReplyData Parse(ReplyData&& reply_data,
const std::string& request_description,
To<ReplyData>);
135formats::
json::
Value Parse(ReplyData&& reply_data,
const std::string& request_description,
To<formats::
json::
Value>);
137std::vector<std::optional<formats::
json::
Value>>
138ParseReplyDataArray(ReplyData&& array_data,
const std::string& request_description,
To<std::vector<std::optional<formats::
json::
Value>>>);
140template <
typename Result,
typename ReplyType = Result>
141requires impl::HasParseFunctionFromRedisReply<Result, ReplyType>
142ReplyType Parse(ReplyData&& reply_data,
const std::string& request_description,
To<Result, ReplyType>) {
143 return Result::Parse(std::move(reply_data), request_description);
147std::vector<T> Parse(ReplyData&& reply_data,
const std::string& request_description,
To<std::vector<T>>) {
148 impl::ExpectArray(reply_data, request_description);
149 return ParseReplyDataArray(std::move(reply_data), request_description,
To<std::vector<T>>{});
153std::optional<T> Parse(ReplyData&& reply_data,
const std::string& request_description,
To<std::optional<T>>) {
154 if (impl::IsNil(reply_data)) {
157 return Parse(std::move(reply_data), request_description,
To<T>{});
162template <
typename Result,
typename ReplyType = Result>
163ReplyType ParseReply(ReplyPtr reply,
const std::string& request_description = {}) {
164 const auto& description = impl::RequestDescription(reply, request_description);
165 impl::ExpectIsOk(reply, description);
166 return Parse(impl::ExtractData(reply), description,
To<Result, ReplyType>{});