Validation des données en Rust : aperçu des bibliothèques et des approches pratiques
Dans le développement moderne en Rust, en particulier lors de la création de services web et d'API, la validation des données entrantes est une tâche cruciale. Le langage Rust offre déjà un système de types puissant qui élimine des classes entières d'erreurs dès la compilation. Cependant, pour vérifier la logique métier (par exemple, la longueur minimale d'un mot de passe, la validité d'un email, une plage de nombres), des outils supplémentaires sont nécessaires. Dans cet article, nous examinerons les trois bibliothèques de validation de données les plus populaires en Rust : validator, garde et valitron.
1. Bibliothèque validator
validator est sans doute la bibliothèque de validation de structures la plus connue et la plus mature en Rust. Elle est basée sur des attributs (derive macros) et prend en charge de nombreuses règles intégrées.
Installation :
[dependencies]validator = { version = "0.18", features = ["derive"] }Exemple d'utilisation :
use validator::Validate;
#[derive(Debug, Validate)]struct User { #[validate(length(min = 3, max = 20))] username: String,
#[validate(email)] email: String,
#[validate(range(min = 18, max = 120))] age: u32,
#[validate(required)] password: Option<String>,}
fn main() { let user = User { username: "Jo".to_string(), email: "invalid-email".to_string(), age: 15, password: None, };
match user.validate() { Ok(_) => println!("Validation réussie !"), Err(errors) => { for (field, err) in &errors.errors() { println!("Erreur dans le champ '{}' : {:?}", field, err); } } }}Avantages :
- Grand nombre de validateurs intégrés : email, URL, longueur, plage, expressions régulières.
- Prise en charge de fonctions de validation personnalisées via l'attribut
custom. - Bonne intégration avec les frameworks web (Actix-web, Axum, Rocket).
Inconvénients :
- Dépend des macros, ce qui peut ralentir la compilation.
- Les erreurs sont renvoyées sous forme de
HashMap, ce qui nécessite un traitement supplémentaire pour l'API.
2. Bibliothèque garde
garde est une alternative plus moderne et plus rapide à validator. Elle utilise également des derive macros, mais offre une API plus flexible et de meilleures performances.
Installation :
[dependencies]garde = "0.20"Exemple d'utilisation :
use garde::Validate;
#[derive(Debug, Validate)]struct LoginRequest { #[garde(length(min = 3, max = 50))] username: String,
#[garde(ascii, length(min = 8))] password: String,
#[garde(skip)] remember_me: bool,}
fn main() { let req = LoginRequest { username: "ab".to_string(), password: "1234567".to_string(), remember_me: true, };
if let Err(errors) = req.validate() { for error in &errors { println!("Erreur : {} - {}", error.path(), error.message()); } } else { println!("Validation réussie !"); }}Avantages :
- Haute performance grâce à un code optimisé.
- Messages d'erreur clairs avec le chemin vers le champ.
- Prise en charge des structures imbriquées et des collections.
- Possibilité de créer ses propres règles sans macros.
Inconvénients :
- Moins de validateurs intégrés (pas d'email, URL par défaut).
- Communauté plus petite que celle de
validator.
3. Bibliothèque valitron
valitron est une bibliothèque légère qui n'utilise pas