mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-17 02:12:56 +00:00
Only a few things that needed updating: - async_trait was removed - Message::Text takes a Utf8Bytes object instead of a String Signed-off-by: Tristan Partin <tristan@neon.tech> Co-authored-by: Conrad Ludgate <connor@neon.tech>
45 lines
1.2 KiB
Rust
45 lines
1.2 KiB
Rust
use std::ops::{Deref, DerefMut};
|
|
|
|
use axum::extract::{rejection::PathRejection, FromRequestParts};
|
|
use compute_api::responses::GenericAPIError;
|
|
use http::{request::Parts, StatusCode};
|
|
|
|
/// Custom `Path` extractor, so that we can format errors into
|
|
/// `JsonResponse<GenericAPIError>`.
|
|
#[derive(Debug, Clone, Copy, Default)]
|
|
pub(crate) struct Path<T>(pub T);
|
|
|
|
impl<S, T> FromRequestParts<S> for Path<T>
|
|
where
|
|
axum::extract::Path<T>: FromRequestParts<S, Rejection = PathRejection>,
|
|
S: Send + Sync,
|
|
{
|
|
type Rejection = (StatusCode, axum::Json<GenericAPIError>);
|
|
|
|
async fn from_request_parts(parts: &mut Parts, state: &S) -> Result<Self, Self::Rejection> {
|
|
match axum::extract::Path::<T>::from_request_parts(parts, state).await {
|
|
Ok(value) => Ok(Self(value.0)),
|
|
Err(rejection) => Err((
|
|
rejection.status(),
|
|
axum::Json(GenericAPIError {
|
|
error: rejection.body_text().to_ascii_lowercase(),
|
|
}),
|
|
)),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<T> Deref for Path<T> {
|
|
type Target = T;
|
|
|
|
fn deref(&self) -> &Self::Target {
|
|
&self.0
|
|
}
|
|
}
|
|
|
|
impl<T> DerefMut for Path<T> {
|
|
fn deref_mut(&mut self) -> &mut Self::Target {
|
|
&mut self.0
|
|
}
|
|
}
|