axum_handler_extract/
lib.rs

1use axum::{
2    extract::FromRequestParts,
3    http::{
4        request::Parts as HttpRequestParts, Extensions as HttpExtensions, Request as HttpRequest,
5    },
6};
7
8//
9pub async fn extensions_extract_from_request<T: FromRequestParts<()>, B>(
10    req: HttpRequest<B>,
11) -> (Result<T, T::Rejection>, HttpRequest<B>) {
12    //
13    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    //
35    let (extract, extensions) = extract_from_extensions(extensions).await;
36
37    //
38    parts.extensions = extensions;
39    let req = HttpRequest::from_parts(parts, body);
40
41    //
42    (extract, req)
43}
44
45//
46pub async fn extract_from_extensions<T: FromRequestParts<()>>(
47    extensions: HttpExtensions,
48) -> (Result<T, T::Rejection>, HttpExtensions) {
49    //
50    let mut parts = {
51        let (mut parts, _) = HttpRequest::new(()).into_parts();
52        parts.extensions = extensions;
53        parts
54    };
55
56    //
57    let extract = T::from_request_parts(&mut parts, &()).await;
58
59    //
60    let extensions = parts.extensions;
61
62    //
63    (extract, extensions)
64}
65
66//
67pub mod matched_path;
68pub mod path;