Что такое validator?
validator — это популярная библиотека для валидации данных в Rust, предоставляющая простой и выразительный способ проверки корректности входных данных. Она основана на макросах и аннотациях, что позволяет описывать правила валидации прямо в структурах данных. Библиотека поддерживает такие проверки, как длина строки, диапазон чисел, регулярные выражения, обязательные поля и пользовательские валидаторы.
Зачем нужна валидация?
В любом приложении, работающем с внешними данными (пользовательский ввод, API-запросы, файлы конфигурации), критически важно проверять корректность этих данных до их обработки. Ошибки валидации могут привести к падению программы, уязвимостям безопасности или некорректной логике. validator позволяет централизованно описывать правила, автоматически генерировать понятные сообщения об ошибках и избегать boilerplate-кода.
Установка
Добавьте в Cargo.toml:
[dependencies]
validator = { version = "0.16", features = ["derive"] }
serde = { version = "1.0", features = ["derive"] }Также часто используется вместе с serde для десериализации данных.
Основные функции
- Атрибуты валидации:
#[validate(length(min = 1, max = 100))],#[validate(range(min = 18, max = 99))],#[validate(email)],#[validate(regex = "...")]и другие. - Пользовательские валидаторы: через атрибут
#[validate(custom = "my_function")]. - Вложенная валидация: для структур, содержащих другие структуры.
- Группировка ошибок: возвращает
ValidationErrorsс детализацией по полям.
Пример кода на Rust
use validator::Validate;
use serde::Deserialize;
#[derive(Debug, Deserialize, Validate)]
struct User {
#[validate(length(min = 2, max = 50))]
name: String,
#[validate(email)]
email: String,
#[validate(range(min = 18, max = 120))]
age: u8,
#[validate(required)]
#[validate(length(min = 8))]
password: Option<String>,
}
fn main() {
let user = User {
name: "A".to_string(), // слишком короткое
email: "invalid".to_string(),
age: 15,
password: Some("123".to_string()),
};
match user.validate() {
Ok(_) => println!("Данные корректны"),
Err(errors) => {
for (field, err_list) in errors.field_errors() {
println!("Поле '{}' имеет ошибки:", field);
for err in err_list {
println!(" - {}", err.message.as_ref().unwrap_or(&"неизвестная ошибка".to_string()));
}
}
}
}
}Когда использовать validator?
- При создании REST API (например, с Actix-web, Axum, Rocket) для проверки входящих JSON-запросов.
- В CLI-приложениях для валидации аргументов командной строки.
- При обработке форм на стороне сервера.
- В любом месте, где требуется декларативная проверка данных с минимальным кодом.
Библиотека идеально подходит для проектов, где важна безопасность и читаемость кода. Она активно поддерживается и широко используется в экосистеме Rust.