#pragma once
#include <memory>
#include <vector>
#include "action_mapper.hpp"
#include "configuration/common/configuration.hpp"
#include "exclusion/input_filter.hpp"
#include "exclusion/rule_filter.hpp"
#include "indexer.hpp"
#include "matcher/base.hpp"
#include "obfuscator.hpp"
#include "processor/base.hpp"
#include "rule.hpp"
#include "ruleset.hpp"
#include "scanner.hpp"
namespace ddwaf {
class ruleset_builder {
public:
ruleset_builder() = default;
~ruleset_builder() = default;
ruleset_builder(ruleset_builder &&) = default;
ruleset_builder(const ruleset_builder &) = delete;
ruleset_builder &operator=(ruleset_builder &&) = delete;
ruleset_builder &operator=(const ruleset_builder &) = delete;
std::shared_ptr<ruleset> build(
const configuration_spec &global_config, change_set current_changes);
protected:
std::shared_ptr<const std::vector<core_rule>> final_base_rules_;
std::shared_ptr<const std::vector<core_rule>> final_user_rules_;
indexer<const core_rule> rule_index_;
std::shared_ptr<const std::vector<rule_filter>> rule_filters_;
std::shared_ptr<const std::vector<input_filter>> input_filters_;
std::shared_ptr<const std::vector<std::unique_ptr<base_processor>>> preprocessors_;
std::shared_ptr<const std::vector<std::unique_ptr<base_processor>>> postprocessors_;
std::shared_ptr<const matcher_mapper> rule_matchers_;
std::shared_ptr<const matcher_mapper> exclusion_matchers_;
std::shared_ptr<const std::vector<scanner>> scanners_;
indexer<const scanner> scanner_index_;
std::shared_ptr<const action_mapper> actions_;
std::shared_ptr<match_obfuscator> obfuscator_;
};
}