void Config::initFieldValidator()

in src/config/config.cc [323:404]


void Config::initFieldValidator() {
  std::map<std::string, ValidateFn> validators = {
      {"requirepass",
       [this]([[maybe_unused]] const std::string &k, const std::string &v) -> Status {
         if (v.empty() && !load_tokens.empty()) {
           return {Status::NotOK, "requirepass empty not allowed while the namespace exists"};
         }
         if (load_tokens.find(v) != load_tokens.end()) {
           return {Status::NotOK, "requirepass is duplicated with namespace tokens"};
         }
         return Status::OK();
       }},
      {"masterauth",
       [this]([[maybe_unused]] const std::string &k, const std::string &v) -> Status {
         if (load_tokens.find(v) != load_tokens.end()) {
           return {Status::NotOK, "masterauth is duplicated with namespace tokens"};
         }
         return Status::OK();
       }},
      {"compact-cron",
       [this]([[maybe_unused]] const std::string &k, const std::string &v) -> Status {
         std::vector<std::string> args = util::Split(v, " \t");
         return compact_cron.SetScheduleTime(args);
       }},
      {"bgsave-cron",
       [this]([[maybe_unused]] const std::string &k, const std::string &v) -> Status {
         std::vector<std::string> args = util::Split(v, " \t");
         return bgsave_cron.SetScheduleTime(args);
       }},
      {"dbsize-scan-cron",
       [this]([[maybe_unused]] const std::string &k, const std::string &v) -> Status {
         std::vector<std::string> args = util::Split(v, " \t");
         return dbsize_scan_cron.SetScheduleTime(args);
       }},
      {"compaction-checker-range",
       [this]([[maybe_unused]] const std::string &k, const std::string &v) -> Status {
         if (!compaction_checker_cron_str_.empty()) {
           return {Status::NotOK, "compaction-checker-range cannot be set while compaction-checker-cron is set"};
         }
         if (v.empty()) {
           compaction_checker_cron.Clear();
           return Status::OK();
         }
         return compaction_checker_cron.SetScheduleTime({"*", v, "*", "*", "*"});
       }},
      {"compaction-checker-cron",
       [this]([[maybe_unused]] const std::string &k, const std::string &v) -> Status {
         std::vector<std::string> args = util::Split(v, " \t");
         return compaction_checker_cron.SetScheduleTime(args);
       }},
      {"rename-command",
       []([[maybe_unused]] const std::string &k, const std::string &v) -> Status {
         std::vector<std::string> all_args = util::Split(v, "\n");
         for (auto &p : all_args) {
           std::vector<std::string> args = util::Split(p, " \t");
           if (args.size() != 2) {
             return {Status::NotOK, "Invalid rename-command format"};
           }
           auto commands = redis::CommandTable::Get();
           auto cmd_iter = commands->find(util::ToLower(args[0]));
           if (cmd_iter == commands->end()) {
             return {Status::NotOK, "No such command in rename-command"};
           }
           if (args[1] != "\"\"") {
             auto new_command_name = util::ToLower(args[1]);
             if (commands->find(new_command_name) != commands->end()) {
               return {Status::NotOK, "Target command name already exists"};
             }
             (*commands)[new_command_name] = cmd_iter->second;
           }
           commands->erase(cmd_iter);
         }
         return Status::OK();
       }},
  };
  for (const auto &iter : validators) {
    auto field_iter = fields_.find(iter.first);
    if (field_iter != fields_.end()) {
      field_iter->second->validate = iter.second;
    }
  }
}