axum_core/ext_traits/
mod.rs

1pub(crate) mod request;
2pub(crate) mod request_parts;
3
4#[cfg(test)]
5mod tests {
6    use std::convert::Infallible;
7
8    use crate::extract::{FromRef, FromRequestParts};
9    use async_trait::async_trait;
10    use http::request::Parts;
11
12    #[derive(Debug, Default, Clone, Copy)]
13    pub(crate) struct State<S>(pub(crate) S);
14
15    #[async_trait]
16    impl<OuterState, InnerState> FromRequestParts<OuterState> for State<InnerState>
17    where
18        InnerState: FromRef<OuterState>,
19        OuterState: Send + Sync,
20    {
21        type Rejection = Infallible;
22
23        async fn from_request_parts(
24            _parts: &mut Parts,
25            state: &OuterState,
26        ) -> Result<Self, Self::Rejection> {
27            let inner_state = InnerState::from_ref(state);
28            Ok(Self(inner_state))
29        }
30    }
31
32    // some extractor that requires the state, such as `SignedCookieJar`
33    #[allow(dead_code)]
34    pub(crate) struct RequiresState(pub(crate) String);
35
36    #[async_trait]
37    impl<S> FromRequestParts<S> for RequiresState
38    where
39        S: Send + Sync,
40        String: FromRef<S>,
41    {
42        type Rejection = Infallible;
43
44        async fn from_request_parts(
45            _parts: &mut Parts,
46            state: &S,
47        ) -> Result<Self, Self::Rejection> {
48            Ok(Self(String::from_ref(state)))
49        }
50    }
51}