axum_handler_extract/
lib.rs1use axum::{
2 extract::FromRequestParts,
3 http::{
4 request::Parts as HttpRequestParts, Extensions as HttpExtensions, Request as HttpRequest,
5 },
6};
7
8pub async fn extensions_extract_from_request<T: FromRequestParts<()>, B>(
10 req: HttpRequest<B>,
11) -> (Result<T, T::Rejection>, HttpRequest<B>) {
12 let (mut parts, extensions, body) = {
14 let (
15 HttpRequestParts {
16 method,
17 uri,
18 version,
19 headers,
20 extensions,
21 ..
22 },
23 body,
24 ) = req.into_parts();
25 let (mut parts, _) = HttpRequest::new(()).into_parts();
26 parts.method = method;
27 parts.uri = uri;
28 parts.version = version;
29 parts.headers = headers;
30
31 (parts, extensions, body)
32 };
33
34 let (extract, extensions) = extract_from_extensions(extensions).await;
36
37 parts.extensions = extensions;
39 let req = HttpRequest::from_parts(parts, body);
40
41 (extract, req)
43}
44
45pub async fn extract_from_extensions<T: FromRequestParts<()>>(
47 extensions: HttpExtensions,
48) -> (Result<T, T::Rejection>, HttpExtensions) {
49 let mut parts = {
51 let (mut parts, _) = HttpRequest::new(()).into_parts();
52 parts.extensions = extensions;
53 parts
54 };
55
56 let extract = T::from_request_parts(&mut parts, &()).await;
58
59 let extensions = parts.extensions;
61
62 (extract, extensions)
64}
65
66pub mod matched_path;
68pub mod path;