Documentation
use mincat_core::request::{FromRequestParts, Parts};
use serde::de::DeserializeOwned;

use super::ExtractError;

pub struct Query<T>(pub T);

#[async_trait::async_trait]
impl<T> FromRequestParts for Query<T>
where
    T: DeserializeOwned + Clone + Send + 'static,
{
    type Error = ExtractError;

    async fn from_request_parts(parts: &mut Parts) -> Result<Self, Self::Error> {
        let query = parts.uri.query().unwrap_or("");
        let res: T = serde_qs::from_str(query).map_err(ExtractError::from)?;
        Ok(Query(res))
    }
}