summaryrefslogtreecommitdiffstats
path: root/src/errors.rs
diff options
context:
space:
mode:
authorSanto Cariotti <santo@dcariotti.me>2022-09-01 16:45:04 +0000
committerSanto Cariotti <santo@dcariotti.me>2022-09-01 16:45:04 +0000
commitab23761e090b8ab6311a360eada7131f6663a3bf (patch)
treeb5a99bb4cfc811e45fc2e3680b4f8b1e944515eb /src/errors.rs
Fork from m6-ie project
Diffstat (limited to 'src/errors.rs')
-rw-r--r--src/errors.rs63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/errors.rs b/src/errors.rs
new file mode 100644
index 0000000..e541eda
--- /dev/null
+++ b/src/errors.rs
@@ -0,0 +1,63 @@
+use axum::{
+ http::StatusCode,
+ response::{IntoResponse, Response},
+ Json,
+};
+use serde_json::json;
+
+/// All errors raised by the web app
+pub enum AppError {
+ /// Generic error, never called yet
+ Generic,
+ /// Database error
+ Database,
+ /// Generic bad request. It is handled with a message value
+ BadRequest(String),
+ /// Not found error
+ NotFound,
+ /// Raised when a token is not good created
+ TokenCreation,
+ /// Raised when a passed token is not valid
+ InvalidToken,
+}
+
+/// Use `AppError` as response for an endpoint
+impl IntoResponse for AppError {
+ /// Matches `AppError` into a tuple of status and error message.
+ /// The response will be a JSON in the format of:
+ /// ```json
+ /// { "error": "<message>" }
+ /// ```
+ fn into_response(self) -> Response {
+ let (status, error_message) = match self {
+ AppError::Generic => (
+ StatusCode::INTERNAL_SERVER_ERROR,
+ "Generic error, can't find why".to_string(),
+ ),
+ AppError::Database => (
+ StatusCode::INTERNAL_SERVER_ERROR,
+ "Error with database connection".to_string(),
+ ),
+ AppError::BadRequest(value) => (StatusCode::BAD_REQUEST, value),
+ AppError::NotFound => (StatusCode::NOT_FOUND, "Element not found".to_string()),
+ AppError::TokenCreation => (
+ StatusCode::INTERNAL_SERVER_ERROR,
+ "Token creation error".to_string(),
+ ),
+ AppError::InvalidToken => (StatusCode::BAD_REQUEST, "Invalid token".to_string()),
+ };
+
+ let body = Json(json!({
+ "error": error_message,
+ }));
+
+ (status, body).into_response()
+ }
+}
+
+/// Transforms a `sqlx::Error` into a `AppError::Databse` error
+impl From<sqlx::Error> for AppError {
+ fn from(_error: sqlx::Error) -> AppError {
+ AppError::Database
+ }
+}