axum_resp_result/convert/from_request/
axum.rs

1use core::{future::Future, marker::Send, pin::Pin};
2
3use axum::extract::{FromRequest, FromRequestParts, Request};
4use futures::TryFutureExt;
5
6use crate::{Nil, RespError, RespResult};
7
8use super::{FromRequestFamily, MapReject, ToInner};
9
10impl<S, T, E> FromRequest<S> for MapReject<T, E>
11where
12    S: Sync,
13    E: Send + From<<T::Payload as FromRequest<S>>::Rejection> + RespError,
14    T: FromRequestFamily<E>,
15    T::Payload: FromRequest<S>,
16{
17    type Rejection = RespResult<Nil, E>;
18
19    fn from_request<'life0, 'async_trait>(
20        req: Request,
21        state: &'life0 S,
22    ) -> ::core::pin::Pin<
23        Box<
24            dyn ::core::future::Future<Output = Result<Self, Self::Rejection>>
25                + ::core::marker::Send
26                + 'async_trait,
27        >,
28    >
29    where
30        'life0: 'async_trait,
31        Self: 'async_trait,
32    {
33        Box::pin(async {
34            <T::Payload as FromRequest<S>>::from_request(req, state)
35                .await
36                .map_err(|err| RespResult::Err(E::from(err)))
37                .map(|data| Self(data.to_inner()))
38        })
39    }
40}
41
42impl<S, T, E> FromRequestParts<S> for MapReject<T, E>
43where
44    S: Sync,
45    E: Send + From<<T::Payload as FromRequestParts<S>>::Rejection> + RespError,
46    T: FromRequestFamily<E>,
47    T::Payload: FromRequestParts<S>,
48{
49    type Rejection = RespResult<Nil, E>;
50
51    fn from_request_parts<'life0, 'life1, 'async_trait>(
52        parts: &'life0 mut http::request::Parts,
53        state: &'life1 S,
54    ) -> Pin<Box<dyn Future<Output = Result<Self, Self::Rejection>> + Send + 'async_trait>>
55    where
56        'life0: 'async_trait,
57        'life1: 'async_trait,
58        Self: 'async_trait,
59    {
60        Box::pin(async {
61            <T::Payload as FromRequestParts<S>>::from_request_parts(parts, state)
62                .map_err(|err| RespResult::Err(E::from(err)))
63                .map_ok(|data| Self(data.to_inner()))
64                .await
65        })
66    }
67}
68mod from_request_families {
69    use axum::extract::{Extension, Form, Json, Path, Query, State};
70
71    use crate::convert::from_request::ToInner;
72
73    impl<T> ToInner for Extension<T> {
74        type Inner = T;
75
76        fn to_inner(self) -> Self::Inner {
77            self.0
78        }
79    }
80
81    impl<T> ToInner for Form<T> {
82        type Inner = T;
83
84        fn to_inner(self) -> Self::Inner {
85            self.0
86        }
87    }
88
89    impl<T> ToInner for Json<T> {
90        type Inner = T;
91
92        fn to_inner(self) -> Self::Inner {
93            self.0
94        }
95    }
96
97    impl<T> ToInner for Path<T> {
98        type Inner = T;
99
100        fn to_inner(self) -> Self::Inner {
101            self.0
102        }
103    }
104
105    impl<T> ToInner for Query<T> {
106        type Inner = T;
107
108        fn to_inner(self) -> Self::Inner {
109            self.0
110        }
111    }
112
113    impl<T> ToInner for State<T> {
114        type Inner = T;
115
116        fn to_inner(self) -> Self::Inner {
117            self.0
118        }
119    }
120}