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")]
54    #[error(transparent)]
55    MsSQLSourceError(#[from] crate::sources::mssql::MsSQLSourceError),
56
57    #[cfg(feature = "src_mssql")]
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_mysql", feature = "dst_arrow"))]
102    #[error(transparent)]
103    MySQLArrowTransportError(#[from] crate::transports::MySQLArrowTransportError),
104
105    #[cfg(all(feature = "src_sqlite", feature = "dst_arrow"))]
106    #[error(transparent)]
107    SQLiteArrowTransportError(#[from] crate::transports::SQLiteArrowTransportError),
108
109    #[cfg(all(feature = "src_mssql", feature = "dst_arrow"))]
110    #[error(transparent)]
111    MsSQLArrowTransportError(#[from] crate::transports::MsSQLArrowTransportError),
112
113    #[cfg(all(feature = "src_oracle", feature = "dst_arrow"))]
114    #[error(transparent)]
115    OracleArrowTransportError(#[from] crate::transports::OracleArrowTransportError),
116
117    #[cfg(all(feature = "src_bigquery", feature = "dst_arrow"))]
118    #[error(transparent)]
119    BigqueryArrowTransportError(#[from] crate::transports::BigQueryArrowTransportError),
120
121    #[cfg(all(feature = "src_trino", feature = "dst_arrow"))]
122    #[error(transparent)]
123    TrinoArrowTransportError(#[from] crate::transports::TrinoArrowTransportError),
124
125    #[cfg(feature = "src_clickhouse")]
126    #[error(transparent)]
127    ClickHouseSourceError(#[from] crate::sources::clickhouse::ClickHouseSourceError),
128
129    #[cfg(all(feature = "src_clickhouse", feature = "dst_arrow"))]
130    #[error(transparent)]
131    ClickHouseArrowTransportError(#[from] crate::transports::ClickHouseArrowTransportError),
132
133    /// Any other errors that are too trivial to be put here explicitly.
134    #[error(transparent)]
135    Other(#[from] anyhow::Error),
136}
137
138/// Errors that can be raised from this library.
139#[derive(Error, Debug)]
140pub enum ConnectorXError {
141    /// The required type does not same as the schema defined.
142    #[error("Data type unexpected: {0:?} expected, {1} found.")]
143    TypeCheckFailed(String, &'static str),
144
145    #[error("Data order not supported {0:?}.")]
146    UnsupportedDataOrder(DataOrder),
147
148    #[error("Cannot resolve data order: got {0:?} from source, {1:?} from destination.")]
149    CannotResolveDataOrder(Vec<DataOrder>, Vec<DataOrder>),
150
151    #[error("Cannot produce a {0}, context: {1}.")]
152    CannotProduce(&'static str, ProduceContext),
153
154    #[error("No conversion rule from {0} to {1}.")]
155    NoConversionRule(String, String),
156
157    #[error("Only support single query with SELECT statement, got {0}.")]
158    SqlQueryNotSupported(String),
159
160    #[error("Cannot get total number of rows in advance.")]
161    CountError(),
162
163    #[error(transparent)]
164    SQLParserError(#[from] sqlparser::parser::ParserError),
165
166    #[error(transparent)]
167    StdIOError(#[from] std::io::Error),
168
169    #[error(transparent)]
170    StdVarError(#[from] std::env::VarError),
171
172    #[error(transparent)]
173    Other(#[from] anyhow::Error),
174}
175
176impl ConnectorXError {
177    pub fn cannot_produce<T>(context: Option<String>) -> Self {
178        ConnectorXError::CannotProduce(type_name::<T>(), context.into())
179    }
180}
181
182#[derive(Debug)]
183pub enum ProduceContext {
184    NoContext,
185    Context(String),
186}
187
188impl From<Option<String>> for ProduceContext {
189    fn from(val: Option<String>) -> Self {
190        match val {
191            Some(c) => ProduceContext::Context(c),
192            None => ProduceContext::NoContext,
193        }
194    }
195}
196
197impl fmt::Display for ProduceContext {
198    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
199        match self {
200            ProduceContext::NoContext => write!(f, "No Context"),
201            ProduceContext::Context(s) => write!(f, "{}", s),
202        }
203    }
204}