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 #[error(transparent)]
169 Other(#[from] anyhow::Error),
170}
171
172#[derive(Error, Debug)]
174pub enum ConnectorXError {
175 #[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}