use axum::extract::{FromRequestParts, Query};
use axum::http::request::Parts;
use serde::de::DeserializeOwned;
use valid8r::Validate;
use super::rejection::ExtractorRejection;
#[derive(Debug, Clone, Copy, Default)]
pub struct ValidatedQuery<T>(pub T);
impl<T> ValidatedQuery<T> {
pub fn into_inner(self) -> T {
self.0
}
}
impl<T, S> FromRequestParts<S> for ValidatedQuery<T>
where
T: DeserializeOwned + Validate,
S: Send + Sync,
{
type Rejection = ExtractorRejection;
async fn from_request_parts(parts: &mut Parts, state: &S) -> Result<Self, Self::Rejection> {
let Query(value) = Query::<T>::from_request_parts(parts, state).await?;
value.validate()?;
Ok(ValidatedQuery(value))
}
}