#pragma once
#include <cstdint>
#include <optional>
#include <string>
#include <string_view>
#include <unordered_map>
#include <variant>
#include <vector>
#include "clock.hpp"
#include "context_allocator.hpp"
#include "dynamic_string.hpp"
#include "exclusion/common.hpp"
#include "matcher/base.hpp"
#include "object.hpp"
#include "object_store.hpp"
#include "target_address.hpp"
#include "transformer/base.hpp"
namespace ddwaf {
enum class data_source : uint8_t { values, keys, object };
struct condition_match {
struct argument {
std::string_view name;
dynamic_string resolved;
std::string_view address{};
std::vector<std::variant<std::string_view, int64_t>> key_path{};
};
std::vector<argument> args;
std::vector<dynamic_string> highlights;
std::string_view operator_name;
std::string_view operator_value;
};
struct condition_cache {
memory::vector<object_cache_key> targets;
std::optional<condition_match> match;
};
struct parameter_specification {
std::string_view name;
bool variadic{false};
bool optional{false};
};
struct condition_target {
std::string name;
target_index index{};
std::vector<std::variant<std::string, int64_t>> key_path{};
std::vector<transformer_id> transformers{};
data_source source{data_source::values};
};
struct condition_parameter {
std::vector<condition_target> targets;
};
class base_condition {
public:
base_condition() = default;
virtual ~base_condition() = default;
base_condition(const base_condition &) = default;
base_condition &operator=(const base_condition &) = default;
base_condition(base_condition &&) = default;
base_condition &operator=(base_condition &&) = default;
virtual bool eval(condition_cache &cache, const object_store &store,
const object_set_ref &objects_excluded, const matcher_mapper &dynamic_matchers,
ddwaf::timer &deadline) const = 0;
virtual void get_addresses(std::unordered_map<target_index, std::string> &addresses) const = 0;
};
}