llm_governance_common/
error.rs

1use 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}