reflex_server/gateway/
error.rs1use 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}