stately_arrow/
error.rs

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}