Skip to content

Добавить validator crate #6

@Th0rN13

Description

@Th0rN13

Зачем добавлять валидацию сейчас?

Без валидации ваш бекенд — это «черный ящик». Если фронтенд пришлет строку вместо числа, Rust (благодаря serde) либо выдаст ошибку десериализации, либо (что хуже) пропустит мусорные данные, которые «упадут» уже в базе.

С валидацией вы получаете:

  • Автоматическую документацию: В Swagger появится описание, что поле email — это не просто строка, а format: email.
  • Безопасность: Отсечение некорректных данных на самом входе.

Рекомендуемый стек для Rust

Чтобы ваш swagger-typescript-api генерировал полезные типы, на бекенде удобно использовать связку:

  1. [validator](https://github.com/Keats/validator) — стандарт индустрии для Rust.
  2. utoipa — если вы хотите генерировать OpenAPI спецификацию прямо из кода Rust.

Пример на Rust (Axum + Utoipa + Validator):

use validator::Validate;
use utoipa::ToSchema;
use serde::Deserialize;

#[derive(Deserialize, Validate, ToSchema)]
pub struct CreateUser {
    #[validate(email)] // Валидация почты
    pub email: String,
    
    #[validate(length(min = 8))] // Минимальная длина
    pub password: String,
}

Как это связывается с вашим TS-клиентом?

Когда вы добавите валидацию в Rust, ваш Swagger JSON начнет содержать информацию о ограничениях.

  1. Генерация: swagger-typescript-api увидит эти ограничения (например, minLength: 8).
  2. Runtime: Если пользователь введет 5 символов, Rust вернет 400 Bad Request.
  3. TS-Result: Ваш кастомный клиент, который мы обсуждали выше, поймает эту ошибку и вернет Err(validationError).

С чего начать прямо сейчас?

Если вы пока не хотите внедрять сложные библиотеки, сделайте минимальный "контракт" для ошибок:

  1. Создайте в Rust перечисление (Enum) для ответов об ошибках.
  2. Реализуйте для него serde::Serialize и utoipa::ToSchema.
  3. В TypeScript клиенте (в шаблоне http-client.ejs) пропишите, что любой ответ, отличный от 2xx, должен проверяться на соответствие этой схеме.

Мой совет: Не пишите валидацию вручную через if/else. Используйте аттрибуты (макросы) вроде #[validate(...)]. Это сохранит ваш код чистым, а OpenAPI — актуальным.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions