axum_resp_result/convert/from_request/
axum.rs1use 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}