llm_governance_common/
error.rs1use actix_web::{error::ResponseError, http::StatusCode, HttpResponse};
2use serde::Serialize;
3use thiserror::Error;
4
5pub type Result<T> = std::result::Result<T, AppError>;
6
7#[derive(Debug, Error)]
8pub enum AppError {
9 #[error("Database error: {0}")]
10 Database(#[from] sqlx::Error),
11
12 #[error("Redis error: {0}")]
13 Redis(#[from] redis::RedisError),
14
15 #[error("Authentication error: {0}")]
16 Auth(String),
17
18 #[error("Validation error: {0}")]
19 Validation(String),
20
21 #[error("Not found: {0}")]
22 NotFound(String),
23
24 #[error("Internal server error: {0}")]
25 Internal(String),
26
27 #[error("Unauthorized")]
28 Unauthorized,
29
30 #[error("Forbidden")]
31 Forbidden,
32
33 #[error("Bad request: {0}")]
34 BadRequest(String),
35}
36
37#[derive(Serialize)]
38struct ErrorResponse {
39 error: String,
40 message: String,
41}
42
43impl ResponseError for AppError {
44 fn status_code(&self) -> StatusCode {
45 match self {
46 AppError::Database(_) => StatusCode::INTERNAL_SERVER_ERROR,
47 AppError::Redis(_) => StatusCode::INTERNAL_SERVER_ERROR,
48 AppError::Auth(_) => StatusCode::UNAUTHORIZED,
49 AppError::Validation(_) => StatusCode::BAD_REQUEST,
50 AppError::NotFound(_) => StatusCode::NOT_FOUND,
51 AppError::Internal(_) => StatusCode::INTERNAL_SERVER_ERROR,
52 AppError::Unauthorized => StatusCode::UNAUTHORIZED,
53 AppError::Forbidden => StatusCode::FORBIDDEN,
54 AppError::BadRequest(_) => StatusCode::BAD_REQUEST,
55 }
56 }
57
58 fn error_response(&self) -> HttpResponse {
59 HttpResponse::build(self.status_code()).json(ErrorResponse {
60 error: self.status_code().to_string(),
61 message: self.to_string(),
62 })
63 }
64}