1use crate::{body::Body, response::IntoResponse};
8use http::request::Parts;
9use std::convert::Infallible;
10use std::future::Future;
11
12pub mod rejection;
13
14mod default_body_limit;
15mod from_ref;
16mod option;
17mod request_parts;
18mod tuple;
19
20pub(crate) use self::default_body_limit::DefaultBodyLimitKind;
21pub use self::{
22 default_body_limit::DefaultBodyLimit,
23 from_ref::FromRef,
24 option::{OptionalFromRequest, OptionalFromRequestParts},
25};
26
27pub type Request<T = Body> = http::Request<T>;
30
31mod private {
32 #[derive(Debug, Clone, Copy)]
33 pub enum ViaParts {}
34
35 #[derive(Debug, Clone, Copy)]
36 pub enum ViaRequest {}
37}
38
39#[diagnostic::on_unimplemented(
51 note = "Function argument is not a valid axum extractor. \nSee `https://docs.rs/axum/0.8/axum/extract/index.html` for details"
52)]
53pub trait FromRequestParts<S>: Sized {
54 type Rejection: IntoResponse;
57
58 fn from_request_parts(
60 parts: &mut Parts,
61 state: &S,
62 ) -> impl Future<Output = Result<Self, Self::Rejection>> + Send;
63}
64
65#[diagnostic::on_unimplemented(
77 note = "Function argument is not a valid axum extractor. \nSee `https://docs.rs/axum/0.8/axum/extract/index.html` for details"
78)]
79pub trait FromRequest<S, M = private::ViaRequest>: Sized {
80 type Rejection: IntoResponse;
83
84 fn from_request(
86 req: Request,
87 state: &S,
88 ) -> impl Future<Output = Result<Self, Self::Rejection>> + Send;
89}
90
91impl<S, T> FromRequest<S, private::ViaParts> for T
92where
93 S: Send + Sync,
94 T: FromRequestParts<S>,
95{
96 type Rejection = <Self as FromRequestParts<S>>::Rejection;
97
98 fn from_request(
99 req: Request,
100 state: &S,
101 ) -> impl Future<Output = Result<Self, Self::Rejection>> {
102 let (mut parts, _) = req.into_parts();
103 async move { Self::from_request_parts(&mut parts, state).await }
104 }
105}
106
107impl<S, T> FromRequestParts<S> for Result<T, T::Rejection>
108where
109 T: FromRequestParts<S>,
110 S: Send + Sync,
111{
112 type Rejection = Infallible;
113
114 async fn from_request_parts(parts: &mut Parts, state: &S) -> Result<Self, Self::Rejection> {
115 Ok(T::from_request_parts(parts, state).await)
116 }
117}
118
119impl<S, T> FromRequest<S> for Result<T, T::Rejection>
120where
121 T: FromRequest<S>,
122 S: Send + Sync,
123{
124 type Rejection = Infallible;
125
126 async fn from_request(req: Request, state: &S) -> Result<Self, Self::Rejection> {
127 Ok(T::from_request(req, state).await)
128 }
129}