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    /// Any other errors that are too trivial to be put here explicitly.
126    #[error(transparent)]
127    Other(#[from] anyhow::Error),
128}
129
130/// Errors that can be raised from this library.
131#[derive(Error, Debug)]
132pub enum ConnectorXError {
133    /// The required type does not same as the schema defined.
134    #[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}