Skip to main content

connectorx/
errors.rs

1use crate::data_order::DataOrder;
2use std::any::type_name;
3use std::fmt;
4use thiserror::Error;
5
6pub type Result<T> = std::result::Result<T, ConnectorXError>;
7pub type OutResult<T> = std::result::Result<T, ConnectorXOutError>;
8
9#[derive(Error, Debug)]
10pub enum ConnectorXOutError {
11    #[error("File {0} not found.")]
12    FileNotFoundError(String),
13
14    #[error("Source {0} not supported.")]
15    SourceNotSupport(String),
16
17    #[error(transparent)]
18    IOError(#[from] std::io::Error),
19
20    #[error(transparent)]
21    JsonError(#[from] serde_json::Error),
22
23    #[cfg(feature = "federation")]
24    #[error(transparent)]
25    J4RSError(#[from] j4rs::errors::J4RsError),
26
27    #[cfg(feature = "fed_exec")]
28    #[error(transparent)]
29    DataFusionError(#[from] datafusion::error::DataFusionError),
30
31    #[error(transparent)]
32    UrlParseError(#[from] url::ParseError),
33
34    #[error(transparent)]
35    ConnectorXInternalError(#[from] ConnectorXError),
36
37    #[cfg(feature = "src_postgres")]
38    #[error(transparent)]
39    PostgresSourceError(#[from] crate::sources::postgres::PostgresSourceError),
40
41    #[cfg(feature = "src_postgres")]
42    #[error(transparent)]
43    PostgresError(#[from] postgres::Error),
44
45    #[cfg(feature = "src_mysql")]
46    #[error(transparent)]
47    MySQLSourceError(#[from] crate::sources::mysql::MySQLSourceError),
48
49    #[cfg(feature = "src_mysql")]
50    #[error(transparent)]
51    MysqlError(#[from] r2d2_mysql::mysql::Error),
52
53    #[cfg(feature = "src_mssql_common")]
54    #[error(transparent)]
55    MsSQLSourceError(#[from] crate::sources::mssql::MsSQLSourceError),
56
57    #[cfg(feature = "src_mssql_tiberius")]
58    #[error(transparent)]
59    MsSQL(#[from] tiberius::error::Error),
60
61    #[cfg(feature = "src_sqlite")]
62    #[error(transparent)]
63    SQLiteSourceError(#[from] crate::sources::sqlite::SQLiteSourceError),
64
65    #[cfg(feature = "src_sqlite")]
66    #[error(transparent)]
67    SQLiteError(#[from] rusqlite::Error),
68
69    #[cfg(feature = "src_oracle")]
70    #[error(transparent)]
71    OracleSourceError(#[from] crate::sources::oracle::OracleSourceError),
72
73    #[cfg(feature = "src_oracle")]
74    #[error(transparent)]
75    OracleError(#[from] r2d2_oracle::oracle::Error),
76
77    #[cfg(feature = "src_bigquery")]
78    #[error(transparent)]
79    BigQuerySourceError(#[from] crate::sources::bigquery::BigQuerySourceError),
80
81    #[cfg(feature = "src_bigquery")]
82    #[error(transparent)]
83    BigQueryError(#[from] gcp_bigquery_client::error::BQError),
84
85    #[cfg(feature = "src_trino")]
86    #[error(transparent)]
87    TrinoSourceError(#[from] crate::sources::trino::TrinoSourceError),
88
89    #[cfg(feature = "dst_arrow")]
90    #[error(transparent)]
91    ArrowError(#[from] crate::destinations::arrow::ArrowDestinationError),
92
93    #[cfg(feature = "dst_arrow")]
94    #[error(transparent)]
95    ArrowStreamError(#[from] crate::destinations::arrowstream::ArrowDestinationError),
96
97    #[cfg(all(feature = "src_postgres", feature = "dst_arrow"))]
98    #[error(transparent)]
99    PostgresArrowTransportError(#[from] crate::transports::PostgresArrowTransportError),
100
101    #[cfg(all(feature = "src_postgres", feature = "dst_arrow"))]
102    #[error(transparent)]
103    PostgresArrowStreamTransportError(#[from] crate::transports::PostgresArrowStreamTransportError),
104
105    #[cfg(all(feature = "src_mysql", feature = "dst_arrow"))]
106    #[error(transparent)]
107    MySQLArrowTransportError(#[from] crate::transports::MySQLArrowTransportError),
108
109    #[cfg(all(feature = "src_mysql", feature = "dst_arrow"))]
110    #[error(transparent)]
111    MySQLArrowStreamTransportError(#[from] crate::transports::MySQLArrowStreamTransportError),
112
113    #[cfg(all(feature = "src_sqlite", feature = "dst_arrow"))]
114    #[error(transparent)]
115    SQLiteArrowTransportError(#[from] crate::transports::SQLiteArrowTransportError),
116
117    #[cfg(all(feature = "src_sqlite", feature = "dst_arrow"))]
118    #[error(transparent)]
119    SQLiteArrowStreamTransportError(#[from] crate::transports::SQLiteArrowStreamTransportError),
120
121    #[cfg(all(feature = "src_mssql_common", feature = "dst_arrow"))]
122    #[error(transparent)]
123    MsSQLArrowTransportError(#[from] crate::transports::MsSQLArrowTransportError),
124
125    #[cfg(all(feature = "src_mssql_common", feature = "dst_arrow"))]
126    #[error(transparent)]
127    MsSQLArrowStreamTransportError(#[from] crate::transports::MsSQLArrowStreamTransportError),
128
129    #[cfg(all(feature = "src_oracle", feature = "dst_arrow"))]
130    #[error(transparent)]
131    OracleArrowTransportError(#[from] crate::transports::OracleArrowTransportError),
132
133    #[cfg(all(feature = "src_oracle", feature = "dst_arrow"))]
134    #[error(transparent)]
135    OracleArrowStreamTransportError(#[from] crate::transports::OracleArrowStreamTransportError),
136
137    #[cfg(all(feature = "src_bigquery", feature = "dst_arrow"))]
138    #[error(transparent)]
139    BigqueryArrowTransportError(#[from] crate::transports::BigQueryArrowTransportError),
140
141    #[cfg(all(feature = "src_bigquery", feature = "dst_arrow"))]
142    #[error(transparent)]
143    BigqueryArrowStreamTransportError(#[from] crate::transports::BigQueryArrowStreamTransportError),
144
145    #[cfg(all(feature = "src_trino", feature = "dst_arrow"))]
146    #[error(transparent)]
147    TrinoArrowTransportError(#[from] crate::transports::TrinoArrowTransportError),
148
149    #[cfg(all(feature = "src_trino", feature = "dst_arrow"))]
150    #[error(transparent)]
151    TrinoArrowStreamTransportError(#[from] crate::transports::TrinoArrowStreamTransportError),
152
153    #[cfg(feature = "src_clickhouse")]
154    #[error(transparent)]
155    ClickHouseSourceError(#[from] crate::sources::clickhouse::ClickHouseSourceError),
156
157    #[cfg(all(feature = "src_clickhouse", feature = "dst_arrow"))]
158    #[error(transparent)]
159    ClickHouseArrowTransportError(#[from] crate::transports::ClickHouseArrowTransportError),
160
161    #[cfg(all(feature = "src_clickhouse", feature = "dst_arrow"))]
162    #[error(transparent)]
163    ClickHouseArrowStreamTransportError(
164        #[from] crate::transports::ClickHouseArrowStreamTransportError,
165    ),
166
167    /// Any other errors that are too trivial to be put here explicitly.
168    #[error(transparent)]
169    Other(#[from] anyhow::Error),
170}
171
172/// Errors that can be raised from this library.
173#[derive(Error, Debug)]
174pub enum ConnectorXError {
175    /// The required type does not same as the schema defined.
176    #[error("Data type unexpected: {0:?} expected, {1} found.")]
177    TypeCheckFailed(String, &'static str),
178
179    #[error("Data order not supported {0:?}.")]
180    UnsupportedDataOrder(DataOrder),
181
182    #[error("Cannot resolve data order: got {0:?} from source, {1:?} from destination.")]
183    CannotResolveDataOrder(Vec<DataOrder>, Vec<DataOrder>),
184
185    #[error("Cannot produce a {0}, context: {1}.")]
186    CannotProduce(&'static str, ProduceContext),
187
188    #[error("No conversion rule from {0} to {1}.")]
189    NoConversionRule(String, String),
190
191    #[error("Only support single query with SELECT statement, got {0}.")]
192    SqlQueryNotSupported(String),
193
194    #[error("Cannot get total number of rows in advance.")]
195    CountError(),
196
197    #[error(transparent)]
198    SQLParserError(#[from] sqlparser::parser::ParserError),
199
200    #[error(transparent)]
201    StdIOError(#[from] std::io::Error),
202
203    #[error(transparent)]
204    StdVarError(#[from] std::env::VarError),
205
206    #[error(transparent)]
207    Other(#[from] anyhow::Error),
208}
209
210impl ConnectorXError {
211    pub fn cannot_produce<T>(context: Option<String>) -> Self {
212        ConnectorXError::CannotProduce(type_name::<T>(), context.into())
213    }
214}
215
216#[derive(Debug)]
217pub enum ProduceContext {
218    NoContext,
219    Context(String),
220}
221
222impl From<Option<String>> for ProduceContext {
223    fn from(val: Option<String>) -> Self {
224        match val {
225            Some(c) => ProduceContext::Context(c),
226            None => ProduceContext::NoContext,
227        }
228    }
229}
230
231impl fmt::Display for ProduceContext {
232    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
233        match self {
234            ProduceContext::NoContext => write!(f, "No Context"),
235            ProduceContext::Context(s) => write!(f, "{}", s),
236        }
237    }
238}
239
240#[cfg(test)]
241mod tests {
242    use super::{ConnectorXError, ProduceContext};
243
244    #[test]
245    fn formats_produce_contexts() {
246        assert_eq!(
247            ProduceContext::from(None).to_string(),
248            ProduceContext::NoContext.to_string()
249        );
250        assert_eq!(
251            ProduceContext::from(Some("column 1".to_string())).to_string(),
252            "column 1"
253        );
254        assert_eq!(ProduceContext::NoContext.to_string(), "No Context");
255    }
256
257    #[test]
258    fn creates_type_specific_production_errors() {
259        let error = ConnectorXError::cannot_produce::<u32>(Some("value".to_string()));
260        assert_eq!(error.to_string(), "Cannot produce a u32, context: value.");
261    }
262}