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 #[error(transparent)]
135 Other(#[from] anyhow::Error),
136}
137
138#[derive(Error, Debug)]
140pub enum ConnectorXError {
141 #[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}