bool parseRuleConfig()

in plugins/wasm-cpp/common/route_rule_matcher.h [356:433]


  bool parseRuleConfig(const json& config) {
    bool has_rules = false;
    int32_t key_count = config.size();
    auto it = config.find("_rules_");
    if (it != config.end()) {
      has_rules = true;
      key_count--;
    }
    PluginConfig plugin_config;
    // has other config fields
    if (key_count > 0 && parsePluginConfig(config, plugin_config)) {
      global_config_ = std::move(plugin_config);
    }
    if (!has_rules) {
      return global_config_ ? true : false;
    }
    auto rules = it.value();
    if (!rules.is_array()) {
      LOG_WARN("'_rules_' field is not an array");
      return false;
    }
    for (const auto& item : rules.items()) {
      RuleConfig rule;
      auto config = item.value();
      if (!parsePluginConfig(config, rule.config)) {
        LOG_WARN("parse rule's config failed");
        return false;
      }
      if (!parseRouteMatchConfig(config, rule.routes)) {
        LOG_WARN("failed to parse configuration for _match_route_");
        return false;
      }
      if (!parseRoutePrefixMatchConfig(config, rule.route_prefixs)) {
        LOG_WARN("failed to parse configuration for _match_route_prefix_");
        return false;
      }
      if (!parseDomainMatchConfig(config, rule.hosts)) {
        LOG_WARN("failed to parse configuration for _match_domain_");
        return false;
      }
      if (!parseServiceMatchConfig(config, rule.services)) {
        LOG_WARN("failed to parse configuration for _match_service_");
        return false;
      }
      auto has_route = !rule.routes.empty();
      auto has_route_prefix = !rule.route_prefixs.empty();
      auto has_service = !rule.services.empty();
      auto has_host = !rule.hosts.empty();
      if (has_route + has_route_prefix + has_host + has_service == 0) {
        LOG_WARN(
            "there is at least one of  '_match_route_', '_match_domain_', "
            "'_match_route_prefix_' and '_match_service_' can "
            "present in configuration.");
        return false;
      }
      if (has_route) {
        rule.category = CATEGORY::Route;
        if (has_service) {
          rule.category = CATEGORY::RouteAndService;
        }
      } else if (has_route_prefix) {
        rule.category = CATEGORY::RoutePrefix;
      } else if (has_service) {
        rule.category = CATEGORY::Service;
      } else {
        rule.category = CATEGORY::Host;
      }
      auto has_disable = config.find("_disable_");
      if (has_disable != config.end()) {
        auto disable = JsonValueAs<bool>(has_disable.value());
        if (disable.second == Wasm::Common::JsonParserResultDetail::OK) {
          rule.disable = disable.first.value();
        }
      }
      rule_config_.push_back(std::move(rule));
    }
    return true;
  }