resp_result/convert/from_request/
actix.rs1use std::{
2 future::Future,
3 marker::PhantomPinned,
4 pin::Pin,
5 task::{Context, Poll},
6};
7
8use actix_web::FromRequest;
9
10use crate::{FromRequestFamily, MapReject, Nil, RespError, RespResult, ToInner};
11
12impl<T, E> FromRequest for MapReject<T, E>
13where
14 T: FromRequestFamily<E>,
15 T::Payload: FromRequest,
16 E: From<<T::Payload as FromRequest>::Error>,
17 E: RespError + 'static,
18{
19 type Error = RespResult<Nil, E>;
20
21 type Future = MapRejectFuture<T, E>;
22
23 fn from_request(
24 req: &actix_web::HttpRequest,
25 payload: &mut actix_web::dev::Payload,
26 ) -> Self::Future {
27 MapRejectFuture {
28 inner: <T::Payload as FromRequest>::from_request(req, payload),
29 __pinned: PhantomPinned,
30 }
31 }
32}
33
34pub struct MapRejectFuture<F, E>
35where
36 F: FromRequestFamily<E>,
37 F::Payload: FromRequest,
38{
39 inner: <F::Payload as FromRequest>::Future,
40 __pinned: PhantomPinned,
41}
42
43impl<F, E> Future for MapRejectFuture<F, E>
44where
45 F: FromRequestFamily<E>,
46 F::Payload: FromRequest,
47 E: From<<F::Payload as FromRequest>::Error>,
48{
49 type Output = Result<MapReject<F, E>, RespResult<Nil, E>>;
50
51 fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
52 let fut = unsafe { Pin::new_unchecked(&mut self.get_unchecked_mut().inner) };
53
54 let Poll::Ready(ready) = fut.poll(cx) else{
55 return Poll::Pending;
56 };
57 Poll::Ready(
58 ready
59 .map_err(|err| RespResult::Err(E::from(err)))
60 .map(|data| MapReject(data.to_inner())),
61 )
62 }
63}
64
65mod from_request_families {
66 use std::{clone::Clone, sync::Arc};
67
68 use actix_web::web::{Data, Form, Header, Json, Path, Query, ReqData};
69
70 use crate::ToInner;
71
72 impl<T> ToInner for Data<T> {
73 type Inner = Arc<T>;
74
75 fn to_inner(self) -> Self::Inner {
76 self.into_inner()
77 }
78 }
79
80 impl<T> ToInner for Form<T> {
81 type Inner = T;
82
83 fn to_inner(self) -> Self::Inner {
84 self.into_inner()
85 }
86 }
87
88 impl<T> ToInner for Header<T> {
89 type Inner = T;
90
91 fn to_inner(self) -> Self::Inner {
92 self.into_inner()
93 }
94 }
95
96 impl<T> ToInner for Json<T> {
97 type Inner = T;
98
99 fn to_inner(self) -> Self::Inner {
100 self.into_inner()
101 }
102 }
103 impl<T> ToInner for Path<T> {
104 type Inner = T;
105
106 fn to_inner(self) -> Self::Inner {
107 self.into_inner()
108 }
109 }
110
111 impl<T> ToInner for Query<T> {
112 type Inner = T;
113
114 fn to_inner(self) -> Self::Inner {
115 self.into_inner()
116 }
117 }
118
119 impl<T: Clone> ToInner for ReqData<T> {
120 type Inner = T;
121
122 fn to_inner(self) -> Self::Inner {
123 self.into_inner()
124 }
125 }
126}