8 data = client.readStringUntil(
'\r');
14 String emitStr((
char)
_type);
25 auto dLen =
data.toInt();
30 data = (
const char *)
nullptr;
34 auto charBuf =
new char[dLen + 1];
35 bzero(charBuf, dLen + 1);
37 auto readB = client.readBytes(charBuf, dLen);
38 if ((
int)readB != dLen)
40 Serial.printf(
"ERROR! Bad read (%ld ?= %ld)\n", (
long)readB, (
long)dLen);
44 data = String(charBuf);
50 String emitStr((
char)
_type);
51 emitStr += String(
data.length());
60 for (
int i = 0; i <
data.toInt(); i++)
64 RedisArray::operator std::vector<String>()
const
66 std::vector<String> result;
68 for(uint i = 0; i < vec.size(); i++)
70 std::shared_ptr<RedisObject> obj = vec.at(i);
72 if(obj->
type() == RedisObject::Type::Array)
74 std::vector<String> nestedArray =
75 (std::vector<String>)*((
RedisArray *)obj.get());
77 for(uint j = 0; j < nestedArray.size(); j++)
79 result.push_back(nestedArray.at(j));
82 else if(obj->
type() == RedisObject::Type::BulkString ||
86 result.push_back(String(*obj));
90 result.push_back(
"Unknown");
98 String emitStr((
char)
_type);
99 emitStr += String(
vec.size());
101 for (
auto rTypeInst :
vec)
103 emitStr += rTypeInst->RESP();
110 if (!cmdClient.connected())
113 auto cmdRespStr =
RESP();
114 cmdClient.print(cmdRespStr);
116 if (ret && ret->type() == RedisObject::Type::InternalError)
122 int RedisCommand::issue_typed<int>(Client &cmdClient)
124 auto cmdRet =
issue(cmdClient);
126 return INT_MAX - 0x0f;
127 if (cmdRet->type() != RedisObject::Type::Integer)
128 return INT_MAX - 0xf0;
133 bool RedisCommand::issue_typed<bool>(Client &cmdClient)
135 auto cmdRet =
issue(cmdClient);
136 if (cmdRet && cmdRet->type() == RedisObject::Type::Integer)
142 String RedisCommand::issue_typed<String>(Client &cmdClient)
144 return (String)*
issue(cmdClient);
150 {RedisObject::Type::SimpleString, [](Client &c)
152 {RedisObject::Type::BulkString, [](Client &c)
154 {RedisObject::Type::Integer, [](Client &c)
156 {RedisObject::Type::Array, [](Client &c)
158 {RedisObject::Type::Error, [](Client &c)
163 if (client.connected() && !client.available()) {
168 if (!client.connected())
174 if (typeChar == -1 || typeChar ==
'\r' || typeChar ==
'\n') {
178 if (g_TypeParseMap.find(typeChar) != g_TypeParseMap.end())
180 auto retVal = g_TypeParseMap[typeChar](client);
182 if (!retVal || retVal->type() == RedisObject::Type::Error)
184 String err = retVal ? (String)*retVal :
"(nil)";
188 return std::shared_ptr<RedisObject>(retVal);
196 std::shared_ptr<RedisObject>
type =
nullptr;
197 while (
type==
nullptr) {