6#include <userver/storages/redis/parse_reply.hpp>
7#include <userver/storages/redis/reply.hpp>
8#include <userver/storages/redis/request.hpp>
10USERVER_NAMESPACE_BEGIN
12namespace storages::
redis {
14template <
typename ReplyType>
18template <
typename ScriptResult,
typename ReplyType = ScriptResult>
19class [[nodiscard]] RequestEvalSha final {
21 using EvalShaResult = storages::
redis::EvalShaResult<ReplyType>;
23 explicit RequestEvalSha(RequestEvalShaCommon&& request)
24 : request_(std::move(request))
34 EvalShaResult
Get(
const std::string& request_description = {}) {
35 auto reply_ptr = request_.GetRaw();
36 const auto& reply_data = reply_ptr->data;
37 if (reply_data.IsError()) {
38 const auto& msg = reply_data.GetError();
39 if (msg.find(
"NOSCRIPT", 0) == 0) {
40 return EvalShaResult(
true);
44 return impl::ParseReply<ScriptResult, ReplyType>(std::move(reply_ptr), request_description);
48 RequestEvalShaCommon request_;
52template <
typename ReplyType>
53class EvalShaResult final {
59 bool HasValue()
const noexcept {
return reply_.has_value(); }
62 const ReplyType&
Get()
const {
return reply_.value(); }
65 ReplyType
Extract() {
return std::move(reply_).value(); }
68 template <
typename,
typename>
69 friend class RequestEvalSha;
71 EvalShaResult() =
default;
72 explicit EvalShaResult(
bool no_script)
73 : no_script_error_{no_script}
75 EvalShaResult(ReplyType&& reply)
76 : reply_(std::move(reply))
78 std::optional<ReplyType> reply_;
79 bool no_script_error_ =
false;