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 #[error(transparent)]
127 Other(#[from] anyhow::Error),
128}
129
130#[derive(Error, Debug)]
132pub enum ConnectorXError {
133 #[error("Data type unexpected: {0:?} expected, {1} found.")]
135 TypeCheckFailed(String, &'static str),
136
137 #[error("Data order not supported {0:?}.")]
138 UnsupportedDataOrder(DataOrder),
139
140 #[error("Cannot resolve data order: got {0:?} from source, {1:?} from destination.")]
141 CannotResolveDataOrder(Vec<DataOrder>, Vec<DataOrder>),
142
143 #[error("Cannot produce a {0}, context: {1}.")]
144 CannotProduce(&'static str, ProduceContext),
145
146 #[error("No conversion rule from {0} to {1}.")]
147 NoConversionRule(String, String),
148
149 #[error("Only support single query with SELECT statement, got {0}.")]
150 SqlQueryNotSupported(String),
151
152 #[error("Cannot get total number of rows in advance.")]
153 CountError(),
154
155 #[error(transparent)]
156 SQLParserError(#[from] sqlparser::parser::ParserError),
157
158 #[error(transparent)]
159 StdIOError(#[from] std::io::Error),
160
161 #[error(transparent)]
162 StdVarError(#[from] std::env::VarError),
163
164 #[error(transparent)]
165 Other(#[from] anyhow::Error),
166}
167
168impl ConnectorXError {
169 pub fn cannot_produce<T>(context: Option<String>) -> Self {
170 ConnectorXError::CannotProduce(type_name::<T>(), context.into())
171 }
172}
173
174#[derive(Debug)]
175pub enum ProduceContext {
176 NoContext,
177 Context(String),
178}
179
180impl From<Option<String>> for ProduceContext {
181 fn from(val: Option<String>) -> Self {
182 match val {
183 Some(c) => ProduceContext::Context(c),
184 None => ProduceContext::NoContext,
185 }
186 }
187}
188
189impl fmt::Display for ProduceContext {
190 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
191 match self {
192 ProduceContext::NoContext => write!(f, "No Context"),
193 ProduceContext::Context(s) => write!(f, "{}", s),
194 }
195 }
196}