1use axum::http::StatusCode;
2use axum::response::{IntoResponse, Response};
3use stately::ApiError;
4
5pub type Result<T, E = Error> = std::result::Result<T, E>;
6
7#[derive(thiserror::Error, Debug)]
8pub enum Error {
9 #[error("Internal error: {0}")]
10 Internal(String),
11
12 #[error("Connection not found: {0}")]
13 ConnectionNotFound(String),
14
15 #[error("Unsupported connector type: {0}")]
16 UnsupportedConnector(String),
17
18 #[error("Session action unsupported: {0}")]
19 UnsupportedSessionAction(String),
20
21 #[error("DataFusion error: {0}")]
22 DataFusion(#[from] datafusion::error::DataFusionError),
23
24 #[error("Arrow error: {0}")]
25 Arrow(#[from] arrow::error::ArrowError),
26
27 #[cfg(feature = "object-store")]
28 #[error("Object store error: {0}")]
29 ObjectStore(#[from] object_store::Error),
30
31 #[cfg(feature = "object-store")]
32 #[error("Object store error during create: {0}")]
33 ObjectStoreCreate(String),
34
35 #[cfg(feature = "clickhouse")]
36 #[error("ClickHouse DataFusion error: {0}")]
37 ClickHouseDatafusion(datafusion::error::DataFusionError),
38
39 #[cfg(feature = "clickhouse")]
40 #[error("ClickHouse Arrow error: {0}")]
41 ClickHouseArrow(#[from] clickhouse_datafusion::prelude::clickhouse_arrow::Error),
42}
43
44impl IntoResponse for Error {
45 fn into_response(self) -> Response {
46 let (status, message) = match &self {
47 Error::ConnectionNotFound(_) => (StatusCode::NOT_FOUND, self.to_string()),
48 Error::UnsupportedSessionAction(_)
49 | Error::UnsupportedConnector(_)
50 | Error::DataFusion(_) => (StatusCode::BAD_REQUEST, self.to_string()),
51 #[cfg(feature = "object-store")]
52 Error::ObjectStore(_) | Error::ObjectStoreCreate(_) => {
53 (StatusCode::BAD_REQUEST, self.to_string())
54 }
55 #[cfg(feature = "clickhouse")]
56 Error::ClickHouseDatafusion(_) => (StatusCode::BAD_REQUEST, self.to_string()),
57 #[cfg(feature = "clickhouse")]
58 Error::ClickHouseArrow(_) => (StatusCode::BAD_REQUEST, self.to_string()),
59 Error::Arrow(_) | Error::Internal(_) => {
60 (StatusCode::INTERNAL_SERVER_ERROR, self.to_string())
61 }
62 };
63
64 (status, axum::Json(ApiError::new(message, status))).into_response()
65 }
66}