reflex_server/gateway/
error.rs

1use axum::{
2    Json,
3    http::{HeaderMap, HeaderValue, StatusCode},
4    response::{IntoResponse, Response},
5};
6use thiserror::Error;
7
8use reflex::cache::REFLEX_STATUS_HEADER;
9use reflex::scoring::ScoringError;
10
11#[derive(Debug, Error)]
12pub enum GatewayError {
13    #[error("invalid request: {0}")]
14    InvalidRequest(String),
15
16    #[error("cache lookup failed: {0}")]
17    CacheLookupFailed(String),
18
19    #[error("scoring failed: {0}")]
20    ScoringFailed(#[from] ScoringError),
21
22    #[error("provider error: {0}")]
23    ProviderError(String),
24
25    #[error("serialization failed: {0}")]
26    SerializationFailed(String),
27
28    #[error("storage error: {0}")]
29    StorageError(String),
30
31    #[error("embedding failed: {0}")]
32    EmbeddingFailed(String),
33
34    #[error("internal error: {0}")]
35    InternalError(String),
36}
37
38#[derive(serde::Serialize)]
39pub struct ErrorResponse {
40    pub error: String,
41    pub code: u16,
42}
43
44impl IntoResponse for GatewayError {
45    fn into_response(self) -> Response {
46        let (status, error_message, reflex_status) = match &self {
47            GatewayError::InvalidRequest(_) => {
48                (StatusCode::BAD_REQUEST, self.to_string(), "invalid_request")
49            }
50            GatewayError::CacheLookupFailed(_) => (
51                StatusCode::INTERNAL_SERVER_ERROR,
52                self.to_string(),
53                "lookup_error",
54            ),
55            GatewayError::ScoringFailed(_) => (
56                StatusCode::INTERNAL_SERVER_ERROR,
57                self.to_string(),
58                "scoring_error",
59            ),
60            GatewayError::ProviderError(_) => {
61                (StatusCode::BAD_GATEWAY, self.to_string(), "provider_error")
62            }
63            GatewayError::SerializationFailed(_) => (
64                StatusCode::INTERNAL_SERVER_ERROR,
65                self.to_string(),
66                "serialization_error",
67            ),
68            GatewayError::StorageError(_) => (
69                StatusCode::INTERNAL_SERVER_ERROR,
70                self.to_string(),
71                "storage_error",
72            ),
73            GatewayError::EmbeddingFailed(_) => (
74                StatusCode::INTERNAL_SERVER_ERROR,
75                self.to_string(),
76                "embedding_error",
77            ),
78            GatewayError::InternalError(_) => (
79                StatusCode::INTERNAL_SERVER_ERROR,
80                self.to_string(),
81                "internal_error",
82            ),
83        };
84
85        let mut headers = HeaderMap::new();
86        headers.insert(
87            REFLEX_STATUS_HEADER,
88            HeaderValue::from_str(reflex_status).unwrap_or(HeaderValue::from_static("error")),
89        );
90
91        let body = Json(ErrorResponse {
92            error: error_message,
93            code: status.as_u16(),
94        });
95
96        (status, headers, body).into_response()
97    }
98}