Status Parse()

in src/commands/cmd_geo.cc [557:616]


  Status Parse(const std::vector<std::string> &args) override {
    CommandParser parser(args, 1);
    store_key_ = GET_OR_RET(parser.TakeStr());
    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("storedist")) {
        store_distance_ = 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 GEOSEARCHSTORE"};
    }

    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);
  }