mirror of
https://github.com/tokio-rs/axum.git
synced 2024-11-21 22:56:46 +01:00
Implement TypedPath
for WithRejection<TypedPath, _>
(#2491)
This commit is contained in:
parent
cdd0eccc0a
commit
c486cc8207
3 changed files with 52 additions and 3 deletions
|
@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning].
|
|||
|
||||
# Unreleased
|
||||
|
||||
- None.
|
||||
- **added:** Implement `TypedPath` for `WithRejection<TypedPath, _>`
|
||||
|
||||
# 0.9.1 (29. December, 2023)
|
||||
|
||||
|
|
|
@ -2,10 +2,13 @@ use axum::async_trait;
|
|||
use axum::extract::{FromRequest, FromRequestParts, Request};
|
||||
use axum::response::IntoResponse;
|
||||
use http::request::Parts;
|
||||
use std::fmt::Debug;
|
||||
use std::fmt::{Debug, Display};
|
||||
use std::marker::PhantomData;
|
||||
use std::ops::{Deref, DerefMut};
|
||||
|
||||
#[cfg(feature = "typed-routing")]
|
||||
use crate::routing::TypedPath;
|
||||
|
||||
/// Extractor for customizing extractor rejections
|
||||
///
|
||||
/// `WithRejection` wraps another extractor and gives you the result. If the
|
||||
|
@ -137,6 +140,23 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "typed-routing")]
|
||||
impl<E, R> TypedPath for WithRejection<E, R>
|
||||
where
|
||||
E: TypedPath,
|
||||
{
|
||||
const PATH: &'static str = E::PATH;
|
||||
}
|
||||
|
||||
impl<E, R> Display for WithRejection<E, R>
|
||||
where
|
||||
E: Display,
|
||||
{
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
write!(f, "{}", self.0)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use axum::body::Body;
|
||||
|
|
|
@ -386,7 +386,15 @@ impl_second_element_is!(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
|
|||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::routing::TypedPath;
|
||||
use crate::{
|
||||
extract::WithRejection,
|
||||
routing::{RouterExt, TypedPath},
|
||||
};
|
||||
use axum::{
|
||||
extract::rejection::PathRejection,
|
||||
response::{IntoResponse, Response},
|
||||
Router,
|
||||
};
|
||||
use serde::Deserialize;
|
||||
|
||||
#[derive(TypedPath, Deserialize)]
|
||||
|
@ -434,4 +442,25 @@ mod tests {
|
|||
|
||||
assert_eq!(uri, "/users/1?&foo=foo&bar=123&baz=true&qux=1337");
|
||||
}
|
||||
|
||||
#[allow(dead_code)] // just needs to compile
|
||||
fn supports_with_rejection() {
|
||||
async fn handler(_: WithRejection<UsersShow, MyRejection>) {}
|
||||
|
||||
struct MyRejection {}
|
||||
|
||||
impl IntoResponse for MyRejection {
|
||||
fn into_response(self) -> Response {
|
||||
unimplemented!()
|
||||
}
|
||||
}
|
||||
|
||||
impl From<PathRejection> for MyRejection {
|
||||
fn from(_: PathRejection) -> Self {
|
||||
unimplemented!()
|
||||
}
|
||||
}
|
||||
|
||||
let _: Router = Router::new().typed_get(handler);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue