#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[allow(clippy::struct_excessive_bools)]
pub struct ValidationConfig {
pub enable_structural_validation: bool,
pub enable_cross_table_validation: bool,
pub enable_field_layout_validation: bool,
pub enable_type_system_validation: bool,
pub enable_semantic_validation: bool,
pub enable_method_validation: bool,
pub enable_token_validation: bool,
pub enable_constraint_validation: bool,
pub max_nesting_depth: usize,
pub enable_raw_validation: bool,
pub enable_owned_validation: bool,
pub lenient: bool,
}
impl Default for ValidationConfig {
fn default() -> Self {
Self {
enable_structural_validation: true,
enable_cross_table_validation: true,
enable_field_layout_validation: true,
enable_type_system_validation: true,
enable_semantic_validation: true,
enable_method_validation: true,
enable_token_validation: true,
enable_constraint_validation: true,
max_nesting_depth: 64,
enable_raw_validation: true,
enable_owned_validation: true,
lenient: false,
}
}
}
impl ValidationConfig {
#[must_use]
pub fn disabled() -> Self {
Self {
enable_structural_validation: false,
enable_cross_table_validation: false,
enable_field_layout_validation: false,
enable_type_system_validation: false,
enable_semantic_validation: false,
enable_method_validation: false,
enable_token_validation: false,
enable_constraint_validation: false,
max_nesting_depth: 0,
enable_raw_validation: false,
enable_owned_validation: false,
lenient: false,
}
}
#[must_use]
pub fn minimal() -> Self {
Self {
enable_structural_validation: true,
enable_cross_table_validation: false,
enable_field_layout_validation: false,
enable_type_system_validation: false,
enable_semantic_validation: false,
enable_method_validation: false,
enable_token_validation: false,
enable_constraint_validation: false,
max_nesting_depth: 64,
enable_raw_validation: true,
enable_owned_validation: false,
lenient: false,
}
}
#[must_use]
pub fn comprehensive() -> Self {
Self::default()
}
#[must_use]
pub fn production() -> Self {
Self {
enable_structural_validation: true, enable_cross_table_validation: true, enable_field_layout_validation: true, enable_type_system_validation: true, enable_semantic_validation: true, enable_method_validation: true, enable_token_validation: true, enable_constraint_validation: true, max_nesting_depth: 64, enable_raw_validation: true, enable_owned_validation: true, lenient: false, }
}
#[must_use]
pub fn strict() -> Self {
Self {
enable_structural_validation: true,
enable_cross_table_validation: true,
enable_field_layout_validation: true,
enable_type_system_validation: true,
enable_semantic_validation: true,
enable_method_validation: true,
enable_token_validation: true,
enable_constraint_validation: true,
max_nesting_depth: 64,
enable_raw_validation: true,
enable_owned_validation: true,
lenient: false,
}
}
#[must_use]
pub fn should_validate_raw(&self) -> bool {
self.enable_raw_validation
}
#[must_use]
pub fn should_validate_owned(&self) -> bool {
self.enable_owned_validation
}
#[must_use]
pub fn raw_only() -> Self {
Self {
enable_structural_validation: true,
enable_cross_table_validation: false,
enable_field_layout_validation: false,
enable_type_system_validation: false,
enable_semantic_validation: false,
enable_method_validation: false,
enable_token_validation: false,
enable_constraint_validation: false,
max_nesting_depth: 64,
enable_raw_validation: true,
enable_owned_validation: false,
lenient: false,
}
}
#[must_use]
pub fn owned_only() -> Self {
Self {
enable_structural_validation: false,
enable_cross_table_validation: true,
enable_field_layout_validation: true,
enable_type_system_validation: true,
enable_semantic_validation: true,
enable_method_validation: true,
enable_token_validation: true,
enable_constraint_validation: true,
max_nesting_depth: 64,
enable_raw_validation: false,
enable_owned_validation: true,
lenient: false,
}
}
#[must_use]
pub fn analysis() -> Self {
Self {
enable_structural_validation: true,
enable_cross_table_validation: true,
enable_field_layout_validation: true,
enable_type_system_validation: true,
enable_semantic_validation: true,
enable_method_validation: true,
enable_token_validation: true,
enable_constraint_validation: true,
max_nesting_depth: 64,
enable_raw_validation: true,
enable_owned_validation: true,
lenient: true, }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_validation_config_presets() {
let disabled = ValidationConfig::disabled();
assert!(!disabled.enable_structural_validation);
assert!(!disabled.enable_cross_table_validation);
assert!(!disabled.enable_field_layout_validation);
assert!(!disabled.enable_type_system_validation);
assert!(!disabled.enable_semantic_validation);
assert!(!disabled.enable_method_validation);
assert!(!disabled.enable_token_validation);
assert_eq!(disabled.max_nesting_depth, 0);
assert!(!disabled.enable_raw_validation);
assert!(!disabled.enable_owned_validation);
let minimal = ValidationConfig::minimal();
assert!(minimal.enable_structural_validation);
assert!(!minimal.enable_cross_table_validation);
assert!(!minimal.enable_semantic_validation);
assert!(!minimal.enable_method_validation);
assert!(!minimal.enable_token_validation);
assert!(minimal.enable_raw_validation);
assert!(!minimal.enable_owned_validation);
let comprehensive = ValidationConfig::comprehensive();
assert!(comprehensive.enable_structural_validation);
assert!(comprehensive.enable_cross_table_validation);
assert!(comprehensive.enable_field_layout_validation);
assert!(comprehensive.enable_type_system_validation);
assert!(comprehensive.enable_semantic_validation);
assert!(comprehensive.enable_method_validation);
assert!(comprehensive.enable_token_validation);
assert!(comprehensive.enable_raw_validation);
assert!(comprehensive.enable_owned_validation);
let production = ValidationConfig::production();
assert!(production.enable_structural_validation);
assert!(production.enable_cross_table_validation);
assert!(production.enable_field_layout_validation);
assert!(production.enable_type_system_validation);
assert!(production.enable_semantic_validation);
assert!(production.enable_method_validation);
assert!(production.enable_token_validation);
assert!(production.enable_constraint_validation);
assert!(production.enable_raw_validation);
assert!(production.enable_owned_validation);
}
#[test]
fn test_default_config() {
let default = ValidationConfig::default();
let comprehensive = ValidationConfig::comprehensive();
assert_eq!(default, comprehensive);
}
#[test]
fn test_validation_stage_methods() {
let production = ValidationConfig::production();
assert!(production.should_validate_raw());
assert!(production.should_validate_owned());
let disabled = ValidationConfig::disabled();
assert!(!disabled.should_validate_raw());
assert!(!disabled.should_validate_owned());
let raw_only = ValidationConfig::raw_only();
assert!(raw_only.should_validate_raw());
assert!(!raw_only.should_validate_owned());
assert!(raw_only.enable_structural_validation);
assert!(!raw_only.enable_cross_table_validation);
let owned_only = ValidationConfig::owned_only();
assert!(!owned_only.should_validate_raw());
assert!(owned_only.should_validate_owned());
assert!(!owned_only.enable_structural_validation);
assert!(owned_only.enable_cross_table_validation);
}
}