1use rustyline::error::ReadlineError;
2use std::fmt::{Display, Formatter};
3use std::io;
4use thiserror::Error;
5
6pub type MyResult<T> = Result<T, MyError>;
7
8#[derive(Debug, Error)]
9pub enum EngineError {
10 HomeDirectory,
11 UnknownDriver(String),
12 ParseDriver(String),
13 SelectDriver(usize),
14 UnmatchedQuote,
15 UnknownDirective(String),
16}
17
18impl Display for EngineError {
19 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
20 match self {
21 Self::HomeDirectory => write!(f, "No home directory"),
22 Self::UnknownDriver(alias) => write!(f, "Unknown driver alias \"{}\"", alias),
23 Self::ParseDriver(driver) => write!(f, "Invalid ODBC string \"{}\"", driver),
24 Self::SelectDriver(count) => write!(f, "Cannot select from {} drivers", count),
25 Self::UnmatchedQuote => write!(f, "Unmatched quote"),
26 Self::UnknownDirective(directive) => write!(f, "Unknown directive \"{}\"", directive),
27 }
28 }
29}
30
31#[derive(Debug, Error)]
32pub enum MyError {
33 #[error(transparent)]
34 Csv(#[from] csv::Error),
35 #[error(transparent)]
36 Io(#[from] io::Error),
37 #[error(transparent)]
38 Odbc(#[from] odbc_api::Error),
39 #[error(transparent)]
40 Readline(#[from] ReadlineError),
41 #[error(transparent)]
42 Regex(#[from] regex::Error),
43 #[error(transparent)]
44 Serde(#[from] serde_yml::Error),
45 #[error(transparent)]
46 Engine(#[from] EngineError),
47}
48
49impl MyError {
50 pub fn eprint(&self) {
51 let error = self.to_string();
52 let error = error.trim_end();
53 eprintln!("{error}");
54 }
55}