#pragma once
#include <cstdint>
#include <string>
#include <string_view>
#include <unordered_map>
#include <unordered_set>
#include <variant>
#include <vector>
#include "object.hpp"
#include "semver.hpp"
#include "utils.hpp"
namespace ddwaf {
class raw_configuration {
public:
using map = std::unordered_map<std::string_view, raw_configuration>;
using vector = std::vector<raw_configuration>;
using string_set = std::unordered_set<std::string_view>;
raw_configuration() = default;
~raw_configuration() = default;
raw_configuration(object_view view) : view_(view) {}
raw_configuration(const raw_configuration &) = default;
raw_configuration &operator=(const raw_configuration &) = default;
raw_configuration(raw_configuration &&other) noexcept = default;
raw_configuration &operator=(raw_configuration &&other) noexcept = default;
explicit operator map() const;
explicit operator vector() const;
explicit operator string_set() const;
explicit operator std::string_view() const;
explicit operator std::string() const;
explicit operator uint64_t() const;
explicit operator int64_t() const;
explicit operator double() const;
explicit operator bool() const;
explicit operator std::vector<std::string>() const;
explicit operator std::vector<std::variant<std::string, int64_t>>() const;
explicit operator std::vector<std::string_view>() const;
explicit operator std::unordered_map<std::string, std::string>() const;
explicit operator std::unordered_map<std::string,
std::variant<bool, int64_t, uint64_t, double, std::string>>() const;
explicit operator semantic_version() const;
explicit operator object_view() const { return view_; }
const object_view *operator->() const { return &view_; }
protected:
object_view view_;
};
template <typename T> struct raw_configuration_traits {
static const char *name() { return typeid(T).name(); }
};
template <> struct raw_configuration_traits<std::string> {
static const char *name() { return "std::string"; }
};
template <> struct raw_configuration_traits<std::string_view> {
static const char *name() { return "std::string_view"; }
};
template <> struct raw_configuration_traits<raw_configuration::map> {
static const char *name() { return "parameter::map"; }
};
template <> struct raw_configuration_traits<raw_configuration::vector> {
static const char *name() { return "parameter::vector"; }
};
template <> struct raw_configuration_traits<raw_configuration::string_set> {
static const char *name() { return "parameter::string_set"; }
};
template <> struct raw_configuration_traits<std::vector<std::string>> {
static const char *name() { return "std::vector<std::string>"; }
};
template <> struct raw_configuration_traits<std::vector<std::variant<std::string, int64_t>>> {
static const char *name() { return "std::vector<std::variant<std::string, int64_t>>"; }
};
template <> struct raw_configuration_traits<std::vector<std::string_view>> {
static const char *name() { return "std::vector<std::string_view>"; }
};
template <> struct raw_configuration_traits<std::unordered_map<std::string, std::string>> {
static const char *name() { return "std::unordered_map<std::string, std::string>"; }
};
template <> struct raw_configuration_traits<std::unordered_map<std::string, scalar_type>> {
static const char *name()
{
return "std::unordered_map<std::string, std::variant<bool, int64_t, uint64_t, double, "
"std::string>>";
}
};
template <> struct raw_configuration_traits<semantic_version> {
static const char *name() { return "semantic_version"; }
};
}