use crate::traits::RequestTrait;
use axum::extract::FromRequest;
use serde::de::DeserializeOwned;
#[derive(Debug, Clone, Copy, Default)]
pub struct Validate<T>(pub T);
#[async_trait::async_trait]
impl<S, T> FromRequest<S> for Validate<T>
where
T: DeserializeOwned + validator::Validate + 'static,
S: Send + Sync,
{
type Rejection = crate::Error;
async fn from_request(req: axum::extract::Request, _: &S) -> Result<Self, Self::Rejection> {
let payload: T = if req.content_type() == mime::APPLICATION_JSON {
req.json::<T>().await?
} else if req.content_type() == mime::APPLICATION_WWW_FORM_URLENCODED {
req.form::<T>().await?
} else if req.content_type() == mime::MULTIPART_FORM_DATA {
req.multipart::<T>().await?
} else {
return Err(crate::Error::UnsupportedMediaType);
};
payload.validate()?;
Ok(Self(payload))
}
}