Validação de dados em Rust: bibliotecas e abordagens

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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

Recommendations