Browse Source

Create HttpError

Lee Morgan 1 month ago
parent
commit
23a740d04b
3 changed files with 62 additions and 0 deletions
  1. 22 0
      Cargo.lock
  2. 2 0
      Cargo.toml
  3. 38 0
      src/http_error.rs

+ 22 - 0
Cargo.lock

@@ -329,6 +329,8 @@ dependencies = [
  "actix-cors",
  "actix-web",
  "dotenvy",
+ "serde",
+ "thiserror",
 ]
 
 [[package]]
@@ -1210,6 +1212,26 @@ dependencies = [
  "syn",
 ]
 
+[[package]]
+name = "thiserror"
+version = "2.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "2.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
 [[package]]
 name = "time"
 version = "0.3.47"

+ 2 - 0
Cargo.toml

@@ -7,3 +7,5 @@ edition = "2024"
 actix-cors = "0.7.1"
 actix-web = "4.13.0"
 dotenvy = "0.15.7"
+serde = "1.0.228"
+thiserror = "2.0.18"

+ 38 - 0
src/http_error.rs

@@ -0,0 +1,38 @@
+use actix_web::{HttpResponse, ResponseError, http::StatusCode};
+use thiserror::Error;
+
+#[derive(Serialize)]
+struct ErrorBody {
+    error: ErrorInfo
+}
+
+#[derive(Serialize)]
+struct ErrorInfo {
+    code: u16,
+    message: String
+}
+
+#[derive(Error, Debug)]
+pub enum HttpError {
+    #[error("{0}")]
+    JsonDeserializationError(String)
+}
+
+impl ResponseError for HttpError {
+    fn status_code(&self) -> StatusCode {
+        match self {
+            HttpError::JsonDeserializationError(_) => StatusCode::BAD_REQUEST
+        }
+    }
+
+    fn error_response(&self) -> HttpResponse {
+        let body = ErrorBody {
+            error: ErrorInfo {
+                code: self.status_code().as_u16(),
+                message: self.to_string()
+            }
+        };
+
+        HttpResponse::build(self.status_code()).json(body)
+    }
+}