Validação de dados em Rust: visão geral de bibliotecas e abordagens práticas
No desenvolvimento moderno com Rust, especialmente na criação de serviços web e APIs, a validação de dados de entrada é uma tarefa criticamente importante. A linguagem Rust já fornece um poderoso sistema de tipos que elimina classes inteiras de erros em tempo de compilação. No entanto, para verificar a lógica de negócios (por exemplo, comprimento mínimo de senha, correção de email, intervalo de números), são necessárias ferramentas adicionais. Neste artigo, examinaremos as três bibliotecas mais populares para validação de dados em Rust: validator, garde e valitron.
1. Biblioteca validator
validator é, talvez, a biblioteca mais conhecida e madura para validação de estruturas em Rust. Ela é construída com base em atributos (derive macros) e suporta muitas regras integradas.
Instalação:
[dependencies]validator = { version = "0.18", features = ["derive"] }Exemplo de uso:
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!("Validação aprovada!"), Err(errors) => { for (field, err) in &errors.errors() { println!("Erro no campo '{}': {:?}", field, err); } } }}Vantagens:
- Grande quantidade de validadores integrados: email, URL, comprimento, intervalo, expressões regulares.
- Suporte para funções de validação personalizadas através do atributo
custom. - Boa integração com frameworks web (Actix-web, Axum, Rocket).
Desvantagens:
- Depende de macros, o que pode desacelerar a compilação.
- Erros são retornados como um
HashMap, exigindo processamento adicional para APIs.
2. Biblioteca garde
garde é uma alternativa mais moderna e rápida ao validator. Ela também usa derive macros, mas oferece uma API mais flexível e melhor desempenho.
Instalação:
[dependencies]garde = "0.20"Exemplo de uso:
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!("Erro: {} - {}", error.path(), error.message()); } } else { println!("Validação bem-sucedida!"); }}Vantagens:
- Alto desempenho devido ao código otimizado.
- Mensagens de erro claras com o caminho para o campo.
- Suporte para estruturas aninhadas e coleções.
- Possibilidade de criar regras próprias sem macros.
Desvantagens:
- Menos validadores integrados (sem email, URL por padrão).
- Comunidade menor que a do
validator.
3. Biblioteca valitron
valitron é uma biblioteca leve que não usa
Também na biblioteca
Validação de dados em PHP com a biblioteca Respect\\Validation
Event Bus e padrão Observer em Go (Golang): implementação pub/sub
Validação de dados em Kotlin: bibliotecas, abordagens e exemplos de código
Geração de PDF em PHP: visão geral das bibliotecas e exemplos de código
Trabalhando com CSV em TypeScript: bibliotecas e exemplos de código