20class ReplyData
final {
22 using Array = std::vector<ReplyData>;
34 class MovableKeyValues
final {
38 View(ReplyData& key_data, ReplyData& value_data)
noexcept : key_data_(key_data), value_data_(value_data) {}
40 std::string& Key()
noexcept {
return key_data_.GetString(); }
41 std::string& Value()
noexcept {
return value_data_.GetString(); }
45 ReplyData& value_data_;
48 class Iterator
final {
50 constexpr Iterator(Array& array, std::size_t index)
noexcept : array_(array), index_(index) {}
51 Iterator& operator++()
noexcept {
55 bool operator!=(
const Iterator& r)
const noexcept {
return index_ != r.index_; }
56 View operator*()
noexcept {
return {array_[index_ * 2], array_[index_ * 2 + 1]}; }
48 class Iterator
final {
…};
63 explicit MovableKeyValues(Array& array)
noexcept : array_(array) {}
65 Iterator begin()
const noexcept {
return {array_, 0}; }
66 Iterator end()
const noexcept {
return {array_, size()}; }
68 std::size_t size()
const noexcept {
return array_.size() / 2; }
34 class MovableKeyValues
final {
…};
74 MovableKeyValues GetMovableKeyValues();
76 ReplyData(
const redisReply* reply);
77 ReplyData(Array&& array);
78 ReplyData(std::string s);
80 static ReplyData CreateError(std::string&& error_msg);
81 static ReplyData CreateStatus(std::string&& status_msg);
82 static ReplyData CreateNil();
84 explicit operator
bool()
const noexcept {
return GetType() != Type::kNoReply; }
86 Type GetType()
const noexcept {
87 UASSERT(!data_.valueless_by_exception());
88 return Type(data_.index());
90 std::string GetTypeString()
const;
92 inline bool IsString()
const noexcept {
return GetType() == Type::kString; }
93 inline bool IsArray()
const noexcept {
return GetType() == Type::kArray; }
94 inline bool IsInt()
const noexcept {
return GetType() == Type::kInteger; }
95 inline bool IsNil()
const noexcept {
return GetType() == Type::kNil; }
96 inline bool IsStatus()
const noexcept {
return GetType() == Type::kStatus; }
97 inline bool IsError()
const noexcept {
return GetType() == Type::kError; }
98 bool IsUnusableInstanceError()
const;
99 bool IsReadonlyError()
const;
100 bool IsUnknownCommandError()
const;
102 bool IsErrorMoved()
const {
return IsError() && !GetError().compare(0, 6,
"MOVED "); }
104 bool IsErrorAsk()
const {
return IsError() && !GetError().compare(0, 4,
"ASK "); }
106 bool IsErrorClusterdown()
const {
return IsError() && !GetError().compare(0, 12,
"CLUSTERDOWN "); }
108 const std::string& GetString()
const {
110 return std::get_if<String>(&data_)->GetUnderlying();
113 std::string& GetString() {
115 return std::get_if<String>(&data_)->GetUnderlying();
118 const Array& GetArray()
const {
120 return *std::get_if<Array>(&data_);
125 return *std::get_if<Array>(&data_);
128 std::int64_t GetInt()
const {
130 return *std::get_if<Integer>(&data_);
133 const std::string& GetStatus()
const {
135 return std::get_if<Status>(&data_)->GetUnderlying();
138 std::string& GetStatus() {
140 return std::get_if<Status>(&data_)->GetUnderlying();
143 const std::string& GetError()
const {
145 return std::get_if<Error>(&data_)->GetUnderlying();
148 std::string& GetError() {
150 return std::get_if<Error>(&data_)->GetUnderlying();
153 std::size_t GetSize()
const noexcept;
155 std::string ToDebugString()
const;
156 static std::string TypeToString(Type type);
158 void ExpectType(ReplyData::Type type,
const std::string& request_description = {})
const;
160 void ExpectString(
const std::string& request_description = {})
const;
161 void ExpectArray(
const std::string& request_description = {})
const;
162 void ExpectInt(
const std::string& request_description = {})
const;
163 void ExpectNil(
const std::string& request_description = {})
const;
164 void ExpectStatus(
const std::string& request_description = {})
const;
165 void ExpectStatusEqualTo(
const std::string& expected_status_str,
const std::string& request_description = {})
const;
166 void ExpectError(
const std::string& request_description = {})
const;
169 ReplyData() =
default;
171 [[noreturn]]
void ThrowUnexpectedReplyType(ReplyData::Type expected,
const std::string& request_description)
const;
174 using String = utils::StrongTypedef<
class StringTag, std::string>;
175 using Integer = std::int64_t;
177 using Status = utils::StrongTypedef<
class StatusTag, std::string>;
178 using Error = utils::StrongTypedef<
class ErrorTag, std::string>;
181 std::variant<NoReply, String, Array, Integer, Nil, Status, Error> data_{};
190 const std::string cmd;
196 operator
bool()
const {
return IsOk(); }
198 std::string_view GetStatusString()
const {
199 return (!IsOk() && data.IsError() ? data.GetError() : std::string_view{});
203 bool IsLoggableError()
const;
204 bool IsUnusableInstanceError()
const;
205 bool IsReadonlyError()
const;
206 bool IsUnknownCommandError()
const;
207 const logging::LogExtra& GetLogExtra()
const;
208 void FillSpanTags(
tracing::Span& span)
const;
210 void ExpectIsOk(
const std::string& request_description = {})
const;
212 const std::string& GetRequestDescription(
const std::string& request_description)
const;