resp_result/convert/from_request/
actix.rs

1use 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}