sinan 0.1.0

A Boilerplate for Rapid Axum Web Service Deployment.
Documentation
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); // 这里定义成 tuple 是因为可以通过元组解构出 value

#[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))
    }
}