The validify integration provides extractors that support both validation and data modification (e.g., trimming strings or lowercasing them) during extraction.
Installation
For standard usage:
cargo add validify
cargo add axum-valid --features validify,basic --no-default-features
For usage with axum-typed-multipart:
cargo add axum_typed_multipart
cargo add axum-valid --features validify,basic,typed_multipart --no-default-features
Modified<E>: Returns the data after modification rules (like #[modify(trim)]) have been applied, but without performing validation. The data might still be invalid.Validated<E>: Performs validation on the extracted data. Used typically with Query.Validified<E>: Performs both modification and validation. Requires the inner type to implement validify::Payload. Used typically with Form or Json.ValidifiedByRef<E>: Similar to Validified, but used when the inner extractor does not use serde::Deserialize to construct data (e.g., TypedMultipart).
Example
use axum_valid::{Modified, Validated, Validified, ValidifiedByRef};
use validify::{Payload, Validate, Validify};
#[derive(Debug, Validify, Deserialize, Payload)]
pub struct Parameters {
#[modify(lowercase)]
#[validate(length(min = 1, max = 50))]
pub v0: String,
}
// Returns modified data, but might be invalid
pub async fn parameters_from_json(modified_parameters: Modified<Json<Parameters>>) {}
// Returns modified AND validated data
pub async fn parameters_from_form(parameters: Validified<Form<Parameters>>) {}
use axum::extract::Query;
use axum::routing::{get, post};
use axum::{Form, Json, Router};
use axum_typed_multipart::{TryFromMultipart, TypedMultipart};
use axum_valid::{Modified, Validated, Validified, ValidifiedByRef};
use serde::Deserialize;
use validify::{Payload, Validate, Validify};
#[derive(Debug, Validify, Deserialize)]
pub struct Paginator {
#[validate(range(min = 1.0, max = 50.0))]
pub page_size: usize,
#[validate(range(min = 1.0))]
pub page_no: usize,
}
#[derive(Debug, Validify, Deserialize, Payload)]
pub struct Parameters {
#[modify(lowercase)]
#[validate(length(min = 1, max = 50))]
pub v0: String,
#[modify(trim)]
#[validate(length(min = 1, max = 100))]
pub v1: String,
}
pub async fn parameters_from_json(modified_parameters: Modified<Json<Parameters>>) {
assert_eq!(modified_parameters.v0, modified_parameters.v0.to_lowercase());
}
pub async fn parameters_from_form(parameters: Validified<Form<Parameters>>) {
assert!(parameters.validate().is_ok());
}