in src/commands/cmd_stream.cc [99:192]
Status Parse(const std::vector<std::string> &args) override {
bool entry_id_found = false;
stream_name_ = args[1];
for (size_t i = 2; i < args.size();) {
auto val = entry_id_found ? args[i] : util::ToLower(args[i]);
if (val == "nomkstream" && !entry_id_found) {
nomkstream_ = true;
++i;
continue;
}
if (val == "maxlen" && !entry_id_found) {
if (i + 1 >= args.size()) {
return {Status::RedisParseErr, errInvalidSyntax};
}
size_t max_len_idx = 0;
bool eq_sign_found = false;
if (args[i + 1] == "=") {
max_len_idx = i + 2;
eq_sign_found = true;
} else {
max_len_idx = i + 1;
}
if (max_len_idx >= args.size()) {
return {Status::RedisParseErr, errInvalidSyntax};
}
auto parse_result = ParseInt<uint64_t>(args[max_len_idx], 10);
if (!parse_result) {
return {Status::RedisParseErr, errValueNotInteger};
}
max_len_ = *parse_result;
with_max_len_ = true;
i += eq_sign_found ? 3 : 2;
continue;
}
if (val == "minid" && !entry_id_found) {
if (i + 1 >= args.size()) {
return {Status::RedisParseErr, errInvalidSyntax};
}
size_t min_id_idx = 0;
bool eq_sign_found = false;
if (args[i + 1] == "=") {
min_id_idx = i + 2;
eq_sign_found = true;
} else {
min_id_idx = i + 1;
}
if (min_id_idx >= args.size()) {
return {Status::RedisParseErr, errInvalidSyntax};
}
auto s = ParseStreamEntryID(args[min_id_idx], &min_id_);
if (!s.IsOK()) return s;
with_min_id_ = true;
i += eq_sign_found ? 3 : 2;
continue;
}
if (val == "limit" && !entry_id_found) {
return {Status::RedisParseErr, errLimitOptionNotAllowed};
}
if (!entry_id_found) {
auto result = ParseNextStreamEntryIDStrategy(val);
if (!result.IsOK()) return result;
next_id_strategy_ = std::move(*result);
entry_id_found = true;
++i;
continue;
}
name_value_pairs_.push_back(val);
++i;
}
if (name_value_pairs_.empty() || name_value_pairs_.size() % 2 != 0) {
return {Status::RedisParseErr, errWrongNumOfArguments};
}
return Status::OK();
}