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}