Skip to content

Commit

Permalink
Implement TypedPath for WithRejection<TypedPath, _> (#2491)
Browse files Browse the repository at this point in the history
  • Loading branch information
davidpdrsn committed Jan 4, 2024
1 parent cdd0ecc commit c486cc8
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 3 deletions.
2 changes: 1 addition & 1 deletion axum-extra/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
22 changes: 21 additions & 1 deletion axum-extra/src/extract/with_rejection.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down
31 changes: 30 additions & 1 deletion axum-extra/src/routing/typed.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)]
Expand Down Expand Up @@ -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);
}
}

0 comments on commit c486cc8

Please sign in to comment.