#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATE_PARAMS_H_
#define MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATE_PARAMS_H_
#include <stdint.h>
#include "base/memory/raw_ptr_exclusion.h"
namespace mojo {
namespace internal {
class ValidationContext;
using ValidateEnumFunc = bool(int32_t, ValidationContext*);
class ContainerValidateParams {
public:
uint32_t expected_num_elements = 0;
bool element_is_nullable = false;
RAW_PTR_EXCLUSION const ContainerValidateParams* key_validate_params =
nullptr;
RAW_PTR_EXCLUSION const ContainerValidateParams* element_validate_params =
nullptr;
ValidateEnumFunc* validate_enum_func = nullptr;
};
template <uint32_t expected_num_elements,
bool element_is_nullable,
const ContainerValidateParams* element_validate_params>
struct ArrayValidateParamsHolder {
static inline constexpr ContainerValidateParams kInstance = {
.expected_num_elements = expected_num_elements,
.element_is_nullable = element_is_nullable,
.key_validate_params = nullptr,
.element_validate_params = element_validate_params,
.validate_enum_func = nullptr,
};
};
template <uint32_t expected_num_elements,
bool element_is_nullable,
ValidateEnumFunc* validate_enum_func>
struct ArrayOfEnumsValidateParamsHolder {
static_assert(validate_enum_func);
static inline constexpr ContainerValidateParams kInstance = {
.expected_num_elements = expected_num_elements,
.element_is_nullable = element_is_nullable,
.key_validate_params = nullptr,
.element_validate_params = nullptr,
.validate_enum_func = validate_enum_func,
};
};
template <const ContainerValidateParams& key_validate_params,
const ContainerValidateParams& element_validate_params>
struct MapValidateParamsHolder {
static inline constexpr ContainerValidateParams kInstance = {
.expected_num_elements = 0,
.element_is_nullable = false,
.key_validate_params = &key_validate_params,
.element_validate_params = &element_validate_params,
.validate_enum_func = nullptr,
};
};
template <uint32_t expected_num_elements,
bool element_is_nullable,
const ContainerValidateParams* element_validate_params>
constexpr const ContainerValidateParams& GetArrayValidator() {
return ArrayValidateParamsHolder<expected_num_elements, element_is_nullable,
element_validate_params>::kInstance;
}
template <uint32_t expected_num_elements,
bool element_is_nullable,
ValidateEnumFunc* validate_enum_func>
constexpr const ContainerValidateParams& GetArrayOfEnumsValidator() {
static_assert(validate_enum_func);
return ArrayOfEnumsValidateParamsHolder<expected_num_elements,
element_is_nullable,
validate_enum_func>::kInstance;
}
template <const ContainerValidateParams& key_validate_params,
const ContainerValidateParams& element_validate_params>
constexpr const ContainerValidateParams& GetMapValidator() {
return MapValidateParamsHolder<key_validate_params,
element_validate_params>::kInstance;
}
}
}
#endif