examples/run/04_config_validator.cat
#!/usr/bin/env catnip
# Validateur de configuration

struct Config {
    server_port; max_connections; timeout; debug_mode; log_level;
}

# Chaque validateur retourne une liste d'erreurs (vide si OK)

trait Validator {
    @abstract
    validate(self, config)
}

struct PortValidator implements(Validator) {
    validate(self, config) => {
        errors = list()
        if config.server_port < 1024 {
            errors = errors + list("Port < 1024 (privilégié)")
        }
        if config.server_port > 65535 {
            errors = errors + list("Port > 65535 (invalide)")
        }
        errors
    }
}

struct ConnectionValidator implements(Validator) {
    validate(self, config) => {
        errors = list()
        if config.max_connections < 10 {
            errors = errors + list("max_connections trop faible (min 10)")
        }
        if config.max_connections > 10000 {
            errors = errors + list("max_connections trop élevé (max 10000)")
        }
        errors
    }
}

struct TimeoutValidator implements(Validator) {
    validate(self, config) => {
        if config.timeout <= 0 {
            list("timeout doit être > 0")
        } else {
            list()
        }
    }
}

struct LogLevelValidator implements(Validator) {
    validate(self, config) => {
        valid_levels = list('debug', 'info', 'warning', 'error')
        found = False
        for level in valid_levels {
            if config.log_level == level { found = True }
        }
        if found { list() } else { list("log_level invalide (debug/info/warning/error)") }
    }
}

# Pipeline de validation
validators = list(PortValidator(), ConnectionValidator(), TimeoutValidator(), LogLevelValidator())

run_validation = (config, validators) => {
    fold(validators, list(), (acc, validator) => { acc + validator.validate(config) })
}

# Configuration à valider (en production, charger depuis JSON/YAML)
config = Config(
    server_port=8080,
    max_connections=100,
    timeout=30,
    debug_mode=False,
    log_level='info',
)

errors = run_validation(config, validators)

# Afficher résultat
print("Validation de configuration")
print()

if len(errors) == 0 {
    print("✓ Configuration valide")
    print()
    print("Paramètres :")
    print(f"  - Port : {config.server_port}")
    print(f"  - Max connections : {config.max_connections}")
    print(f"  - Timeout : {config.timeout}s")
    print(f"  - Debug : {config.debug_mode}")
    print(f"  - Log level : {config.log_level}")
} else {
    print("✗ Configuration invalide")
    print()
    print("Erreurs :")
    for e in errors {
        print("  - " + e)
    }
}

# Retourner status (0 = succès, 1 = échec)
if len(errors) == 0 { 0 } else { 1 }