aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTolmachev Igor <me@igorek.dev>2025-10-18 14:59:43 +0300
committerTolmachev Igor <me@igorek.dev>2025-10-18 14:59:43 +0300
commit67ed4e6bb82ac2645f9b7a014a8d635d7b80e821 (patch)
tree2b5fec154c95d53bdc818bbdd2fac2e695e0157a
parentacf3f72d2d0b8e4b96809783cb82cefbbc23441f (diff)
downloadqueue_server-67ed4e6bb82ac2645f9b7a014a8d635d7b80e821.tar.gz
queue_server-67ed4e6bb82ac2645f9b7a014a8d635d7b80e821.zip
Add fallback handlers for 404 and 405
-rw-r--r--src/error/client.rs8
-rw-r--r--src/main.rs2
-rw-r--r--src/routers/mod.rs17
3 files changed, 26 insertions, 1 deletions
diff --git a/src/error/client.rs b/src/error/client.rs
index e93bbb7..9b2c89b 100644
--- a/src/error/client.rs
+++ b/src/error/client.rs
@@ -1,4 +1,6 @@
1pub enum ClientError { 1pub enum ClientError {
2 NotFound { path: String },
3 MethodNotAllowed { path: String },
2 BadJsonBody(String), 4 BadJsonBody(String),
3 BadQueryString(String), 5 BadQueryString(String),
4 BadAuthTokenHeader(String), 6 BadAuthTokenHeader(String),
@@ -13,6 +15,8 @@ pub enum ClientError {
13impl ClientError { 15impl ClientError {
14 pub fn kind(&self) -> String { 16 pub fn kind(&self) -> String {
15 match self { 17 match self {
18 Self::NotFound { .. } => "NotFound",
19 Self::MethodNotAllowed { .. } => "MethodNotAllowed",
16 Self::BadJsonBody(..) => "BadJsonBody", 20 Self::BadJsonBody(..) => "BadJsonBody",
17 Self::BadQueryString(..) => "BadQueryString", 21 Self::BadQueryString(..) => "BadQueryString",
18 Self::BadAuthTokenHeader(..) => "BadAuthTokenHeader", 22 Self::BadAuthTokenHeader(..) => "BadAuthTokenHeader",
@@ -28,6 +32,10 @@ impl ClientError {
28 32
29 pub fn into_message(self) -> String { 33 pub fn into_message(self) -> String {
30 match self { 34 match self {
35 Self::NotFound { path } => format!("endpoint `{}` not found", path),
36 Self::MethodNotAllowed { path } => {
37 format!("endpoint `{}` doesn't support this method", path)
38 }
31 Self::BadJsonBody(msg) => msg, 39 Self::BadJsonBody(msg) => msg,
32 Self::BadQueryString(msg) => msg, 40 Self::BadQueryString(msg) => msg,
33 Self::BadAuthTokenHeader(msg) => msg, 41 Self::BadAuthTokenHeader(msg) => msg,
diff --git a/src/main.rs b/src/main.rs
index 560225e..4541646 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -38,6 +38,8 @@ async fn router() -> Router {
38 .layer(TraceLayer::new_for_http()) 38 .layer(TraceLayer::new_for_http())
39 .with_state(AppState { db, secret }) 39 .with_state(AppState { db, secret })
40 .merge(Scalar::with_url("/docs", api)) 40 .merge(Scalar::with_url("/docs", api))
41 .fallback(routers::not_found)
42 .method_not_allowed_fallback(routers::method_not_allowed)
41} 43}
42 44
43#[tokio::main] 45#[tokio::main]
diff --git a/src/routers/mod.rs b/src/routers/mod.rs
index b7bc1e6..f9ec049 100644
--- a/src/routers/mod.rs
+++ b/src/routers/mod.rs
@@ -1,10 +1,25 @@
1mod account; 1mod account;
2mod queue; 2mod queue;
3 3
4use axum::extract::OriginalUri;
4use utoipa::OpenApi; 5use utoipa::OpenApi;
5use utoipa_axum::router::OpenApiRouter; 6use utoipa_axum::router::OpenApiRouter;
6 7
7use crate::{AppOpenApi, AppState}; 8use crate::{AppOpenApi, AppState, ClientError, ErrorResponse};
9
10pub async fn not_found(OriginalUri(path): OriginalUri) -> ErrorResponse {
11 ClientError::NotFound {
12 path: path.to_string(),
13 }
14 .into()
15}
16
17pub async fn method_not_allowed(OriginalUri(path): OriginalUri) -> ErrorResponse {
18 ClientError::MethodNotAllowed {
19 path: path.to_string(),
20 }
21 .into()
22}
8 23
9pub fn router() -> OpenApiRouter<AppState> { 24pub fn router() -> OpenApiRouter<AppState> {
10 OpenApiRouter::with_openapi(AppOpenApi::openapi()) 25 OpenApiRouter::with_openapi(AppOpenApi::openapi())