Validación de datos en Rust: revisión de bibliotecas y frameworks
La validación de datos es una etapa críticamente importante en el desarrollo de cualquier aplicación en Rust. La seguridad, estabilidad y previsibilidad del funcionamiento del programa dependen de la correcta verificación de los datos de entrada. En el ecosistema de Rust existen varias soluciones maduras para la validación, cada una con sus propias características. En este artículo, analizaremos en detalle tres bibliotecas principales: validator, garde y validify, y también abordaremos las capacidades integradas de serde.
1. Biblioteca validator
validator es la biblioteca más popular para la validación de estructuras de datos. Proporciona atributos para anotar campos de estructuras y la generación automática de código de verificación a través de macros derive.
Instalación
[dependencies]validator = { version = "0.18", features = ["derive"] }Ejemplo de uso
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!("Datos correctos"), Err(errors) => { for (field, err) in &errors { println!("Error en el campo '{}': {:?}", field, err); } } }}Principales capacidades de validator
- Validadores integrados:
email,url,phone,credit_card,ip,must_matchy otros. - Verificación de longitudes de cadenas, rangos numéricos, expresiones regulares.
- Validación de estructuras anidadas mediante
#[validate(nested)]. - Soporte para validadores personalizados a través de
custom.
2. Biblioteca garde
garde es un framework de validación moderno y de alto rendimiento que se posiciona como una alternativa a validator con un rendimiento mejorado y un sistema de reglas más flexible.
Instalación
[dependencies]garde = "0.21"Ejemplo de uso
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: "contraseña".to_string(), };
if let Err(errors) = form.validate() { for error in errors { println!("Error: {}", error.message); } } else { println!("Formulario válido"); }}Ventajas de garde
- Alto rendimiento gracias a la minimización de asignaciones.
- Soporte para validadores asíncronos.
- Amplio conjunto de reglas integradas:
email,url,ip,phone,credit_card,patterny otras. - Agrupación de reglas y validación contextual.
- Posibilidad de crear validadores personalizados con lógica arbitraria.
3. Biblioteca validify
validify es un framework que se integra con serde y proporciona una forma conveniente de validar datos inmediatamente después de la deserialización. Esto es especialmente útil al trabajar con frameworks web (actix-web, axum).