ayun-server 0.23.0

The RUST Framework for Web Rustceans.
Documentation
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))
    }
}