validator — Валидация данных в Rust

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Что такое 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.

Рекомендаций