fix(axum-macros): use OptionalFromRequest for Option<T> fields (#3760)

This commit is contained in:
patelshudhanshu1999-maker
2026-05-16 23:33:44 +02:00
committed by GitHub
parent a480d71f6d
commit 6ed9210351
7 changed files with 174 additions and 10 deletions
+21 -9
View File
@@ -476,19 +476,25 @@ fn extract_fields(
if peel_option(&field.ty).is_some() {
let field_ty = into_outer(via.as_ref(), ty_span, peel_option(&field.ty).unwrap());
let map_err = if let Some(rejection) = rejection {
quote! { <#rejection as ::std::convert::From<_>>::from }
} else {
quote! { ::axum::response::IntoResponse::into_response }
};
let tokens = match tr {
Trait::FromRequest => {
quote_spanned! {ty_span=>
#member: {
let (mut parts, body) = req.into_parts();
let value =
<#field_ty as ::axum::extract::FromRequestParts<_>>::from_request_parts(
<#field_ty as ::axum::extract::OptionalFromRequestParts<_>>::from_request_parts(
&mut parts,
state,
)
.await
.ok()
.map(#into_inner);
.map(|opt| opt.map(#into_inner))
.map_err(#map_err)?;
req = ::axum::http::Request::from_parts(parts, body);
value
},
@@ -497,13 +503,13 @@ fn extract_fields(
Trait::FromRequestParts => {
quote_spanned! {ty_span=>
#member: {
<#field_ty as ::axum::extract::FromRequestParts<_>>::from_request_parts(
<#field_ty as ::axum::extract::OptionalFromRequestParts<_>>::from_request_parts(
parts,
state,
)
.await
.ok()
.map(#into_inner)
.map(|opt| opt.map(#into_inner))
.map_err(#map_err)?
},
}
}
@@ -597,12 +603,18 @@ fn extract_fields(
let item = if peel_option(&field.ty).is_some() {
let field_ty = into_outer(via.as_ref(), ty_span, peel_option(&field.ty).unwrap());
let map_err = if let Some(rejection) = rejection {
quote! { <#rejection as ::std::convert::From<_>>::from }
} else {
quote! { ::axum::response::IntoResponse::into_response }
};
quote_spanned! {ty_span=>
#member: {
<#field_ty as ::axum::extract::FromRequest<_, _>>::from_request(req, state)
<#field_ty as ::axum::extract::OptionalFromRequest<_, _>>::from_request(req, state)
.await
.ok()
.map(#into_inner)
.map(|opt| opt.map(#into_inner))
.map_err(#map_err)?
},
}
} else if peel_result_ok(&field.ty).is_some() {