use thiserror::Error;
#[derive(Debug, Error)]
pub enum BorsaError {
#[error("unsupported capability: {capability}")]
Unsupported {
capability: &'static str,
},
#[error("data issue: {0}")]
Data(String),
#[error("invalid argument: {0}")]
InvalidArg(String),
#[error("{connector} failed: {msg}")]
Connector {
connector: String,
msg: String,
},
#[error("unknown error: {0}")]
Other(String),
#[error("not found: {what}")]
NotFound {
what: String,
},
#[error("all providers failed: {0:?}")]
AllProvidersFailed(Vec<BorsaError>),
#[error("provider timed out: {capability} via {connector}")]
ProviderTimeout {
connector: String,
capability: &'static str,
},
#[error("request timed out: {capability}")]
RequestTimeout {
capability: &'static str,
},
#[error("all providers timed out: {capability}")]
AllProvidersTimedOut {
capability: &'static str,
},
}
impl BorsaError {
#[must_use]
pub const fn unsupported(cap: &'static str) -> Self {
Self::Unsupported { capability: cap }
}
pub fn connector(connector: impl Into<String>, msg: impl Into<String>) -> Self {
Self::Connector {
connector: connector.into(),
msg: msg.into(),
}
}
pub fn not_found(what: impl Into<String>) -> Self {
Self::NotFound { what: what.into() }
}
pub fn provider_timeout(connector: impl Into<String>, capability: &'static str) -> Self {
Self::ProviderTimeout {
connector: connector.into(),
capability,
}
}
#[must_use]
pub const fn request_timeout(capability: &'static str) -> Self {
Self::RequestTimeout { capability }
}
}
impl From<paft::Error> for BorsaError {
fn from(err: paft::Error) -> Self {
use paft::Error as E;
match err {
E::Money(_) => Self::Data(err.to_string()),
E::Core(_) | E::Domain(_) | E::Market(_) | E::MoneyParse(_) | E::Canonical(_) => {
Self::InvalidArg(err.to_string())
}
}
}
}
impl From<paft::market::MarketError> for BorsaError {
fn from(e: paft::market::MarketError) -> Self {
Self::InvalidArg(e.to_string())
}
}
impl From<paft::domain::DomainError> for BorsaError {
fn from(e: paft::domain::DomainError) -> Self {
Self::InvalidArg(e.to_string())
}
}
impl From<paft::core::PaftError> for BorsaError {
fn from(e: paft::core::PaftError) -> Self {
Self::InvalidArg(e.to_string())
}
}
impl From<paft::money::MoneyError> for BorsaError {
fn from(e: paft::money::MoneyError) -> Self {
Self::Data(e.to_string())
}
}