Datenvalidierung in Rust: Überblick über Bibliotheken und Frameworks
Datenvalidierung ist ein kritischer Schritt in der Entwicklung jeder Anwendung in Rust. Die Sicherheit, Stabilität und Vorhersagbarkeit des Programms hängen von der Korrektheit der Prüfung der Eingabedaten ab. Im Rust-Ökosystem gibt es mehrere ausgereifte Lösungen zur Validierung, jede mit ihren eigenen Besonderheiten. In diesem Artikel betrachten wir drei Hauptbibliotheken im Detail: validator, garde und validify, und gehen auch auf die integrierten Möglichkeiten von serde ein.
1. Die Bibliothek validator
validator ist die beliebteste Bibliothek zur Validierung von Datenstrukturen. Sie bietet Attribute zur Annotation von Strukturfeldern und zur automatischen Generierung von Prüfcode über derive-Makros.
Installation
[dependencies]validator = { version = "0.18", features = ["derive"] }Anwendungsbeispiel
use validator::Validate;
#[derive(Debug, Validate)]struct User { #[validate(length(min = 3, max = 50))] username: String,
#[validate(email)] email: String,
#[validate(range(min = 18, max = 120))] age: u8,
#[validate(required)] phone: Option<String>,}
fn main() { let user = User { username: "Jo".to_string(), email: "invalid-email".to_string(), age: 15, phone: None, };
match user.validate() { Ok(_) => println!("Daten sind korrekt"), Err(errors) => { for (field, err) in &errors { println!("Fehler im Feld '{}': {:?}", field, err); } } }}Hauptfunktionen von validator
- Integrierte Validatoren:
email,url,phone,credit_card,ip,must_matchund andere. - Prüfung von Zeichenkettenlängen, Zahlenbereichen, regulären Ausdrücken.
- Validierung verschachtelter Strukturen über
#[validate(nested)]. - Unterstützung benutzerdefinierter Validatoren über
custom.
2. Die Bibliothek garde
garde ist ein modernes und leistungsstarkes Validierungs-Framework, das sich als Alternative zu validator mit verbesserter Leistung und einem flexibleren Regelsystem positioniert.
Installation
[dependencies]garde = "0.21"Anwendungsbeispiel
use garde::Validate;
#[derive(Debug, Validate)]struct RegisterForm { #[garde(length(min = 3, max = 50))] username: String,
#[garde(email)] email: String,
#[garde(range(min = 18))] age: u32,
#[garde(ascii)] password: String,}
fn main() { let form = RegisterForm { username: "a".to_string(), email: "test".to_string(), age: 15, password: "пароль".to_string(), };
if let Err(errors) = form.validate() { for error in errors { println!("Fehler: {}", error.message); } } else { println!("Formular ist gültig"); }}Vorteile von garde
- Hohe Leistung durch Minimierung von Allokationen.
- Unterstützung asynchroner Validatoren.
- Umfangreicher Satz integrierter Regeln:
email,url,ip,phone,credit_card,patternund andere. - Gruppierung von Regeln und kontextbezogene Validierung.
- Möglichkeit zur Erstellung benutzerdefinierter Validatoren mit beliebiger Logik.
3. Die Bibliothek validify
validify ist ein Framework, das sich in serde integriert und eine bequeme Möglichkeit zur Datenvalidierung direkt nach der Deserialisierung bietet. Dies ist besonders nützlich bei der Arbeit mit Web-Frameworks (actix-web, axum).
Installation
Auch in der Bibliothek
Mikro-ORM für TypeScript: Komplettes Tutorial mit Beispielen
Datenbankmigrationen in C# (.NET): Entity Framework, FluentMigrator und andere Ansätze
Autorisierung und Authentifizierung in PHP: Vollständiger Leitfaden mit Beispielen
Firebase SDK für Swift: Vollständige Anleitung mit Beispielen
Prometheus-Metriken in TypeScript: Vollständiger Leitfaden zum Monitoring