axol 0.2.0

Axol Web Framework
use std::ops::{Deref, DerefMut};

use axol_http::{header::TypedHeader, request::RequestPartsRef, response::ResponsePartsRef};

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

#[derive(Debug, Clone, Copy, Default)]
#[must_use]
pub struct Typed<H: TypedHeader>(pub H);

impl<H: TypedHeader> Deref for Typed<H> {
    type Target = H;

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

impl<H: TypedHeader> DerefMut for Typed<H> {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.0
    }
}

impl<H: TypedHeader> IntoResponseParts for Typed<H> {
    fn into_response_parts(self, response: &mut ResponsePartsRef<'_>) -> Result<()> {
        self.0.encode(response.headers);
        Ok(())
    }
}

#[async_trait::async_trait]
impl<'a, H: TypedHeader + Send + Sync + 'a> FromRequestParts<'a> for Typed<H> {
    async fn from_request_parts(request: RequestPartsRef<'a>) -> Result<Self> {
        request
            .headers
            .get_typed::<H>()
            .ok_or_else(|| Error::bad_request(format!("missing header: {}", H::name())))
            .map(Typed)
    }
}