use std::fmt::Debug;
use axum::async_trait;
use axum::extract::FromRequest;
use serde::de::DeserializeOwned;
use crate::error::Error;
use super::Request;
#[derive(Debug, Clone, Copy, Default)]
pub struct Validate<T>(pub T);
#[async_trait]
impl<T, S> FromRequest<S> for Validate<T>
where
T: DeserializeOwned + validator::Validate + 'static,
S: Send + Sync,
{
type Rejection = Error;
async fn from_request(req: axum::extract::Request, _: &S) -> Result<Self, Self::Rejection> {
let request: Request<axum::extract::Request> = req.into();
let payload: T = request.content().await?;
Ok(Self(payload))
}
}