use thiserror::Error;
#[derive(Error, Debug)]
pub enum OhlcvError {
#[error("IO error: {reason}")]
IoError {
reason: String,
},
#[error("ZIP error: {reason}")]
ZipError {
reason: String,
},
#[error("CSV error: {reason}")]
CsvError {
reason: String,
},
#[error("Date parse error: {reason}")]
DateParseError {
reason: String,
},
#[error("Decimal parse error: {reason}")]
DecimalParseError {
reason: String,
},
#[error("Invalid parameter: {reason}")]
InvalidParameter {
reason: String,
},
#[error("required column `{column}` is missing")]
MissingColumn {
column: &'static str,
},
#[error("failed to parse row: {reason}")]
RowParsing {
reason: String,
},
#[error("no file with extension `{extension}` found in ZIP archive")]
MissingZipEntry {
extension: &'static str,
},
#[error("async task failed: {reason}")]
AsyncTask {
reason: String,
},
}
impl From<std::io::Error> for OhlcvError {
fn from(error: std::io::Error) -> Self {
Self::IoError {
reason: error.to_string(),
}
}
}
impl From<zip::result::ZipError> for OhlcvError {
fn from(error: zip::result::ZipError) -> Self {
Self::ZipError {
reason: format!("ZIP error: {error:?}"),
}
}
}
impl From<chrono::ParseError> for OhlcvError {
fn from(error: chrono::ParseError) -> Self {
Self::DateParseError {
reason: format!("Date parse error: {error}"),
}
}
}
impl From<rust_decimal::Error> for OhlcvError {
fn from(error: rust_decimal::Error) -> Self {
Self::DecimalParseError {
reason: format!("Decimal parse error: {error}"),
}
}
}