axum_handler_extract/
path.rs

1use axum::{
2    extract::{rejection::PathRejection, Path},
3    http::{Extensions as HttpExtensions, Request as HttpRequest},
4};
5use serde::de::DeserializeOwned;
6
7use crate::{extensions_extract_from_request, extract_from_extensions};
8
9//
10pub async fn path_from_request<T, B>(
11    req: HttpRequest<B>,
12) -> Result<(Option<Path<T>>, HttpRequest<B>), (PathRejection, HttpRequest<B>)>
13where
14    T: DeserializeOwned + Send,
15{
16    let (path, req) = extensions_extract_from_request(req).await;
17    match path {
18        Ok(x) => Ok((Some(x), req)),
19        Err(PathRejection::MissingPathParams(_)) => Ok((None, req)),
20        Err(err) => Err((err, req)),
21    }
22}
23
24//
25pub async fn path_from_extensions<T>(
26    extensions: HttpExtensions,
27) -> Result<(Option<Path<T>>, HttpExtensions), (PathRejection, HttpExtensions)>
28where
29    T: DeserializeOwned + Send,
30{
31    let (path, extensions) = extract_from_extensions(extensions).await;
32    match path {
33        Ok(x) => Ok((Some(x), extensions)),
34        Err(PathRejection::MissingPathParams(_)) => Ok((None, extensions)),
35        Err(err) => Err((err, extensions)),
36    }
37}