axum_kit/
validation.rs

1use crate::error::Error;
2use axum::{
3    extract::{rejection::JsonRejection, FromRequest, Request},
4    Json,
5};
6use serde::de::DeserializeOwned;
7use validator::Validate;
8
9#[derive(Debug, Clone, Copy, Default)]
10pub struct ValidatedJson<T>(pub T);
11
12impl<T, S> FromRequest<S> for ValidatedJson<T>
13where
14    T: DeserializeOwned + Validate,
15    S: Send + Sync,
16    Json<T>: FromRequest<S, Rejection = JsonRejection>,
17{
18    type Rejection = Error;
19
20    async fn from_request(req: Request, state: &S) -> Result<Self, Self::Rejection> {
21        let Json(value) = Json::<T>::from_request(req, state).await?;
22        value.validate()?;
23        Ok(ValidatedJson(value))
24    }
25}