in src/commands/cmd_geo.cc [391:454]
Status Parse(const std::vector<std::string> &args) override {
CommandParser parser(args, 1);
key_ = GET_OR_RET(parser.TakeStr());
while (parser.Good()) {
if (parser.EatEqICase("frommember")) {
auto s = setOriginType(kMember);
if (!s.IsOK()) return s;
member_ = GET_OR_RET(parser.TakeStr());
} else if (parser.EatEqICase("fromlonlat")) {
auto s = setOriginType(kLongLat);
if (!s.IsOK()) return s;
longitude_ = GET_OR_RET(parser.TakeFloat());
latitude_ = GET_OR_RET(parser.TakeFloat());
s = ValidateLongLat(&longitude_, &latitude_);
if (!s.IsOK()) return s;
} else if (parser.EatEqICase("byradius")) {
auto s = setShapeType(kGeoShapeTypeCircular);
if (!s.IsOK()) return s;
radius_ = GET_OR_RET(parser.TakeFloat());
std::string distance_raw = GET_OR_RET(parser.TakeStr());
s = ParseDistanceUnit(distance_raw);
if (!s.IsOK()) return s;
} else if (parser.EatEqICase("bybox")) {
auto s = setShapeType(kGeoShapeTypeRectangular);
if (!s.IsOK()) return s;
width_ = GET_OR_RET(parser.TakeFloat());
height_ = GET_OR_RET(parser.TakeFloat());
std::string distance_raw = GET_OR_RET(parser.TakeStr());
s = ParseDistanceUnit(distance_raw);
if (!s.IsOK()) return s;
} else if (parser.EatEqICase("asc") && sort_ == kSortNone) {
sort_ = kSortASC;
} else if (parser.EatEqICase("desc") && sort_ == kSortNone) {
sort_ = kSortDESC;
} else if (parser.EatEqICase("count")) {
count_ = GET_OR_RET(parser.TakeInt<int>(NumericRange<int>{1, std::numeric_limits<int>::max()}));
} else if (parser.EatEqICase("withcoord")) {
with_coord_ = true;
} else if (parser.EatEqICase("withdist")) {
with_dist_ = true;
} else if (parser.EatEqICase("withhash")) {
with_hash_ = true;
} else {
return {Status::RedisParseErr, "Invalid argument given"};
}
}
if (origin_point_type_ == kNone) {
return {Status::RedisParseErr, "exactly one of FROMMEMBER or FROMLONLAT can be specified for GEOSEARCH"};
}
if (member_ != "" && longitude_ != 0 && latitude_ != 0) {
return {Status::RedisParseErr, "please use only one of FROMMEMBER or FROMLONLAT"};
}
auto s = createGeoShape();
if (!s.IsOK()) {
return s;
}
return Commander::Parse(args);
}