Datenvalidierung in Rust: Überblick über Bibliotheken und praktische Ansätze
In der modernen Entwicklung mit Rust, insbesondere bei der Erstellung von Webdiensten und APIs, ist die Validierung eingehender Daten eine kritische Aufgabe. Die Sprache Rust bietet bereits ein mächtiges Typsystem, das ganze Fehlerklassen bereits zur Kompilierzeit ausschließt. Für die Überprüfung der Geschäftslogik (z. B. Mindestlänge eines Passworts, Korrektheit einer E-Mail, Zahlenbereich) sind jedoch zusätzliche Werkzeuge erforderlich. In diesem Artikel betrachten wir die drei beliebtesten Bibliotheken zur Datenvalidierung in Rust: validator, garde und valitron.
1. Die Bibliothek validator
validator ist wohl die bekannteste und ausgereifteste Bibliothek zur Validierung von Strukturen in Rust. Sie basiert auf Attributen (derive macros) und unterstützt eine Vielzahl integrierter Regeln.
Installation:
[dependencies]validator = { version = "0.18", features = ["derive"] }Anwendungsbeispiel:
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!("Validierung bestanden!"), Err(errors) => { for (field, err) in &errors.errors() { println!("Fehler im Feld '{}': {:?}", field, err); } } }}Vorteile:
- Große Anzahl integrierter Validatoren: E-Mail, URL, Länge, Bereich, reguläre Ausdrücke.
- Unterstützung für benutzerdefinierte Validierungsfunktionen über das Attribut
custom. - Gute Integration mit Web-Frameworks (Actix-web, Axum, Rocket).
Nachteile:
- Abhängig von Makros, was die Kompilierung verlangsamen kann.
- Fehler werden als
HashMapzurückgegeben, was eine zusätzliche Verarbeitung für die API erfordert.
2. Die Bibliothek garde
garde ist eine modernere und schnellere Alternative zu validator. Sie verwendet ebenfalls derive-Makros, bietet aber eine flexiblere API und eine bessere Leistung.
Installation:
[dependencies]garde = "0.20"Anwendungsbeispiel:
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!("Fehler: {} - {}", error.path(), error.message()); } } else { println!("Validierung erfolgreich!"); }}Vorteile:
- Hohe Leistung durch optimierten Code.
- Klare Fehlermeldungen mit Pfad zum Feld.
- Unterstützung für verschachtelte Strukturen und Sammlungen.
- Möglichkeit, eigene Regeln ohne Makros zu erstellen.
Nachteile:
- Weniger integrierte Validatoren (standardmäßig keine E-Mail, URL).
- Kleinere Community als bei
validator.
3. Die Bibliothek valitron
valitron ist eine leichte Bibliothek, die keine
Auch in der Bibliothek
CLI-Framework für Swift: Erstellung von Konsolen-Dienstprogrammen für iOS/macOS
Arbeiten mit XML in Go: encoding/xml, Bibliotheken und Beispiele
Objektserialisierung in TypeScript: Ein vollständiger Leitfaden
Arbeit mit YAML in Node.js: Bibliotheken js-yaml und yaml