use thiserror::Error;
pub use crate::date::DateError;
#[derive(Debug, Error)]
pub enum Error {
#[error("date error: {0}")]
Date(#[from] DateError),
#[error("treasury error: {0}")]
Treasury(String),
#[error("sofr error: {0}")]
Sofr(String),
#[error("parquet I/O error: {0}")]
Parquet(String),
#[error("interpolation error: {0}")]
Interpolation(String),
#[error("no data for date: {0}")]
DateNotFound(String),
#[error("http error: {0}")]
Http(#[from] reqwest::Error),
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
#[error("arrow error: {0}")]
Arrow(#[from] arrow::error::ArrowError),
#[error("parquet error: {0}")]
ParquetNative(#[from] parquet::errors::ParquetError),
#[error("checksum mismatch for {file}: expected sha256:{expected} got sha256:{actual}")]
ChecksumMismatch {
file: String,
expected: String,
actual: String,
},
#[error("{0}")]
Other(String),
}
pub type Result<T, E = Error> = std::result::Result<T, E>;
pub type CurvekitError = Error;
#[derive(Debug, Error)]
pub enum TreasuryError {
#[error("HTTP error: {0}")]
Http(#[from] reqwest::Error),
#[error("CSV parse error: {0}")]
Parse(String),
#[error("Empty response for date range {start}–{end}")]
EmptyResponse { start: String, end: String },
#[error("Invalid date range: start {start} > end {end}")]
InvalidDateRange { start: u32, end: u32 },
}
#[derive(Debug, Error)]
pub enum SofrError {
#[error("HTTP error: {0}")]
Http(#[from] reqwest::Error),
#[error("CSV parse error: {0}")]
Parse(String),
#[error("Empty response for date range {start}–{end}")]
EmptyResponse { start: String, end: String },
#[error("Invalid date range: start {start} > end {end}")]
InvalidDateRange { start: u32, end: u32 },
}
#[derive(Debug, Error)]
pub enum ParquetError {
#[error("Arrow error: {0}")]
Arrow(#[from] arrow::error::ArrowError),
#[error("Parquet file error: {0}")]
Parquet(#[from] parquet::errors::ParquetError),
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
#[error("Schema error: {0}")]
Schema(String),
}
impl From<TreasuryError> for Error {
fn from(e: TreasuryError) -> Self {
match e {
TreasuryError::Http(inner) => Error::Http(inner),
other => Error::Treasury(other.to_string()),
}
}
}
impl From<SofrError> for Error {
fn from(e: SofrError) -> Self {
match e {
SofrError::Http(inner) => Error::Http(inner),
other => Error::Sofr(other.to_string()),
}
}
}
impl From<ParquetError> for Error {
fn from(e: ParquetError) -> Self {
match e {
ParquetError::Arrow(inner) => Error::Arrow(inner),
ParquetError::Parquet(inner) => Error::ParquetNative(inner),
ParquetError::Io(inner) => Error::Io(inner),
ParquetError::Schema(s) => Error::Parquet(s),
}
}
}
impl From<anyhow::Error> for Error {
fn from(e: anyhow::Error) -> Self {
Error::Other(e.to_string())
}
}