1use crate::{Future, IntoResponse, Request};
4
5pub trait FromRequest: Sized {
7 type Error: IntoResponse;
9
10 #[must_use]
12 fn extract(req: &mut Request) -> impl Future<Output = Result<Self, Self::Error>> + Send;
13}
14
15impl<T> FromRequest for Option<T>
16where
17 T: FromRequest,
18{
19 type Error = std::convert::Infallible;
20
21 async fn extract(req: &mut Request) -> Result<Self, Self::Error> {
22 Ok(T::extract(req).await.ok())
23 }
24}
25
26impl<T> FromRequest for Result<T, T::Error>
27where
28 T: FromRequest,
29{
30 type Error = std::convert::Infallible;
31
32 async fn extract(req: &mut Request) -> Result<Self, Self::Error> {
33 Ok(T::extract(req).await)
34 }
35}