Зачем добавлять валидацию сейчас?
Без валидации ваш бекенд — это «черный ящик». Если фронтенд пришлет строку вместо числа, Rust (благодаря serde) либо выдаст ошибку десериализации, либо (что хуже) пропустит мусорные данные, которые «упадут» уже в базе.
С валидацией вы получаете:
- Автоматическую документацию: В Swagger появится описание, что поле
email — это не просто строка, а format: email.
- Безопасность: Отсечение некорректных данных на самом входе.
Рекомендуемый стек для Rust
Чтобы ваш swagger-typescript-api генерировал полезные типы, на бекенде удобно использовать связку:
- [validator](https://github.com/Keats/validator) — стандарт индустрии для Rust.
- 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 начнет содержать информацию о ограничениях.
- Генерация:
swagger-typescript-api увидит эти ограничения (например, minLength: 8).
- Runtime: Если пользователь введет 5 символов, Rust вернет
400 Bad Request.
- TS-Result: Ваш кастомный клиент, который мы обсуждали выше, поймает эту ошибку и вернет
Err(validationError).
С чего начать прямо сейчас?
Если вы пока не хотите внедрять сложные библиотеки, сделайте минимальный "контракт" для ошибок:
- Создайте в Rust перечисление (Enum) для ответов об ошибках.
- Реализуйте для него
serde::Serialize и utoipa::ToSchema.
- В TypeScript клиенте (в шаблоне
http-client.ejs) пропишите, что любой ответ, отличный от 2xx, должен проверяться на соответствие этой схеме.
Мой совет: Не пишите валидацию вручную через if/else. Используйте аттрибуты (макросы) вроде #[validate(...)]. Это сохранит ваш код чистым, а OpenAPI — актуальным.
Зачем добавлять валидацию сейчас?
Без валидации ваш бекенд — это «черный ящик». Если фронтенд пришлет строку вместо числа, Rust (благодаря
serde) либо выдаст ошибку десериализации, либо (что хуже) пропустит мусорные данные, которые «упадут» уже в базе.С валидацией вы получаете:
email— это не просто строка, аformat: email.Рекомендуемый стек для Rust
Чтобы ваш
swagger-typescript-apiгенерировал полезные типы, на бекенде удобно использовать связку:Пример на Rust (Axum + Utoipa + Validator):
Как это связывается с вашим TS-клиентом?
Когда вы добавите валидацию в Rust, ваш Swagger JSON начнет содержать информацию о ограничениях.
swagger-typescript-apiувидит эти ограничения (например,minLength: 8).400 Bad Request.Err(validationError).С чего начать прямо сейчас?
Если вы пока не хотите внедрять сложные библиотеки, сделайте минимальный "контракт" для ошибок:
serde::Serializeиutoipa::ToSchema.http-client.ejs) пропишите, что любой ответ, отличный от 2xx, должен проверяться на соответствие этой схеме.Мой совет: Не пишите валидацию вручную через
if/else. Используйте аттрибуты (макросы) вроде#[validate(...)]. Это сохранит ваш код чистым, а OpenAPI — актуальным.