pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
#[cfg(feature = "native")]
#[error("Database error: {0}")]
Database(#[from] rusqlite::Error),
#[error("JSON error: {0}")]
Json(#[from] serde_json::Error),
#[cfg(any(feature = "native", feature = "wasm"))]
#[error("HTTP error: {0}")]
Http(#[from] reqwest::Error),
#[error("Parse error: {message}")]
Parse { message: String },
#[error("Amount error: {message}")]
Amount { message: String },
#[error("Crypto error: {message}")]
Crypto { message: String },
#[error("Server error: {message}")]
Server { message: String },
#[error("Wallet error: {message}")]
Wallet { message: String },
#[error("Terms of service must be accepted")]
TermsNotAccepted,
#[error("Invalid input: {message}")]
InvalidInput { message: String },
#[error("Operation not supported: {message}")]
NotSupported { message: String },
#[error("Authentication error: {message}")]
Auth { message: String },
#[error("Insufficient funds: needed {needed}, available {available}")]
InsufficientFunds { needed: String, available: String },
#[error("{message}")]
Other { message: String },
}
impl Error {
pub fn parse<S: Into<String>>(message: S) -> Self {
Error::Parse {
message: message.into(),
}
}
pub fn amount<S: Into<String>>(message: S) -> Self {
Error::Amount {
message: message.into(),
}
}
pub fn crypto<S: Into<String>>(message: S) -> Self {
Error::Crypto {
message: message.into(),
}
}
pub fn server<S: Into<String>>(message: S) -> Self {
Error::Server {
message: message.into(),
}
}
pub fn wallet<S: Into<String>>(message: S) -> Self {
Error::Wallet {
message: message.into(),
}
}
pub fn invalid_input<S: Into<String>>(message: S) -> Self {
Error::InvalidInput {
message: message.into(),
}
}
pub fn not_supported<S: Into<String>>(message: S) -> Self {
Error::NotSupported {
message: message.into(),
}
}
pub fn auth<S: Into<String>>(message: S) -> Self {
Error::Auth {
message: message.into(),
}
}
pub fn insufficient_funds<S: Into<String>>(needed: S, available: S) -> Self {
Error::InsufficientFunds {
needed: needed.into(),
available: available.into(),
}
}
pub fn other<S: Into<String>>(message: S) -> Self {
Error::Other {
message: message.into(),
}
}
pub fn with_context<S: Into<String>>(self, context: S) -> Self {
match self {
Error::Io(e) => Error::Io(e),
#[cfg(feature = "native")]
Error::Database(e) => Error::Database(e),
Error::Json(e) => Error::Json(e),
#[cfg(any(feature = "native", feature = "wasm"))]
Error::Http(e) => Error::Http(e),
Error::Parse { message } => Error::Parse {
message: format!("{}: {}", context.into(), message),
},
Error::Amount { message } => Error::Amount {
message: format!("{}: {}", context.into(), message),
},
Error::Crypto { message } => Error::Crypto {
message: format!("{}: {}", context.into(), message),
},
Error::Server { message } => Error::Server {
message: format!("{}: {}", context.into(), message),
},
Error::Wallet { message } => Error::Wallet {
message: format!("{}: {}", context.into(), message),
},
Error::TermsNotAccepted => Error::TermsNotAccepted,
Error::InvalidInput { message } => Error::InvalidInput {
message: format!("{}: {}", context.into(), message),
},
Error::NotSupported { message } => Error::NotSupported {
message: format!("{}: {}", context.into(), message),
},
Error::Auth { message } => Error::Auth {
message: format!("{}: {}", context.into(), message),
},
Error::InsufficientFunds { needed, available } => Error::InsufficientFunds {
needed: format!("{}: {}", context.into(), needed),
available,
},
Error::Other { message } => Error::Other {
message: format!("{}: {}", context.into(), message),
},
}
}
}