composable-tower-http 0.3.1

Highly customizable http utilities built on top of tower.
Documentation
#[derive(Debug, Clone)]
pub struct Extracted<T>(pub T);

#[cfg(feature = "axum")]
mod axum {
    use axum::{async_trait, extract::FromRequestParts, http::request::Parts, Extension};
    use http::StatusCode;

    use crate::extract::sealed_extracted::SealedExtracted;

    use super::Extracted;

    #[async_trait]
    impl<T, S> FromRequestParts<S> for Extracted<T>
    where
        T: Clone + Send + Sync + 'static,
        S: Send + Sync,
    {
        type Rejection = StatusCode;

        async fn from_request_parts(parts: &mut Parts, state: &S) -> Result<Self, Self::Rejection> {
            let extracted = Extension::<SealedExtracted<T>>::from_request_parts(parts, state).await;

            match extracted {
                Ok(Extension(SealedExtracted(extracted))) => Ok(Extracted(extracted)),
                Err(_) => {
                    tracing::error!(
                        "Requested extracted extension was not found. Did you use `Extractor` with `ExtensionLayer`?"
                    );

                    Err(StatusCode::INTERNAL_SERVER_ERROR)
                }
            }
        }
    }
}