std::optional compileDropIn()

in src/oomd/config/ConfigCompiler.cpp [229:280]


std::optional<Engine::DropInUnit> compileDropIn(
    const IR::Root& root,
    const IR::Root& dropin,
    const PluginConstructionContext& context) {
  Engine::DropInUnit ret;

  for (const auto& dropin_rs : dropin.rulesets) {
    bool found_target = false;

    for (const auto& rs : root.rulesets) {
      if (rs.name == dropin_rs.name) {
        found_target = true;

        auto target = compileRuleset(rs, false, context);
        if (!target) {
          return std::nullopt;
        }

        auto compiled_drop = compileRuleset(dropin_rs, true, context);
        if (!compiled_drop) {
          return std::nullopt;
        }

        if (!target->mergeWithDropIn(std::move(compiled_drop))) {
          OLOG << "Could not merge drop in ruleset=" << dropin_rs.name;
          return std::nullopt;
        }

        ret.rulesets.emplace_back(std::move(target));
        break;
      }
    }

    if (!found_target) {
      OLOG << "Could not locate targeted ruleset=" << dropin_rs.name;
      return std::nullopt;
    }
  }

  for (const auto& prekill_hook : dropin.prekill_hooks) {
    auto compiled_prekill_hook_plugin =
        compilePrekillHook(prekill_hook, context);
    if (!compiled_prekill_hook_plugin) {
      OLOG << "Unknown PrekillHook \"" << prekill_hook.name << "\"";
      return std::nullopt;
    }

    ret.prekill_hooks.emplace_back(std::move(compiled_prekill_hook_plugin));
  }

  return ret;
}