Skip to main content

zql_cli/
error.rs

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}