←
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 }