chuanyue-service/library/src/model/query_validator.rs
2024-09-30 15:17:15 +08:00

41 lines
1.3 KiB
Rust

use axum::{async_trait, body::Body, extract::{FromRequest, FromRequestParts, Query}};
use http::Request;
use i18n::{message, message_ids::MessageId};
use validator::Validate;
use crate::utils::request_util;
use super::response::ResErr;
pub struct QueryValidator<T>(pub T);
#[async_trait]
impl<S, T> FromRequest<S> for QueryValidator<T>
where
S: Send + Sync,
T: Validate,
Query<T>: FromRequestParts<S>,
{
type Rejection = ResErr;
async fn from_request(req: http::Request<Body>, state: &S) -> Result<Self, Self::Rejection> {
let (parts, body) = req.into_parts();
let header = &parts.headers;
let query = Query::<T>::from_request(Request::from_parts(parts.clone(), body), state).await;
if let Ok(Query(data)) = query {
match data.validate() {
Ok(_) => Ok(QueryValidator(data)),
Err(_) => {
let lang_tag = request_util::get_lang_tag(header);
let err = Err(ResErr::params(message!(&lang_tag, MessageId::InvalidParams)));
err
},
}
} else {
let lang_tag = request_util::get_lang_tag(header);
let err = Err(ResErr::params(message!(&lang_tag, MessageId::InvalidParams)));
err
}
}
}