axol 0.2.0

Axol Web Framework
use std::ops::Deref;

use axol_http::request::RequestPartsRef;
use serde::Deserialize;

use crate::{Error, FromRequestParts, Result};

#[derive(Debug, Clone)]
pub struct RawQuery<'a>(pub &'a str);

impl<'a> Deref for RawQuery<'a> {
    type Target = str;

    fn deref(&self) -> &Self::Target {
        self.0
    }
}

#[async_trait::async_trait]
impl<'a> FromRequestParts<'a> for RawQuery<'a> {
    async fn from_request_parts(request: RequestPartsRef<'a>) -> Result<Self> {
        request
            .uri
            .query()
            .map(RawQuery)
            .ok_or_else(|| Error::bad_request("missing query string"))
    }
}

#[derive(Debug, Clone)]
pub struct Query<T>(pub T);

impl<T> Deref for Query<T> {
    type Target = T;

    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

#[async_trait::async_trait]
impl<'a, T: Deserialize<'a> + Send + Sync + 'a> FromRequestParts<'a> for Query<T> {
    async fn from_request_parts(request: RequestPartsRef<'a>) -> Result<Self> {
        let query = request.uri.query().unwrap_or_default();
        Ok(Query(serde_urlencoded::from_str(query).map_err(|e| {
            Error::bad_request(format!("Failed to deserialize query string: {e}"))
        })?))
    }
}