use nym_types::error::TypesError; use nym_wallet_types::network::Network; use serde::{Serialize, Serializer}; use std::io; use std::num::ParseIntError; use thiserror::Error; use validator_client::validator_api::error::ValidatorAPIError; use validator_client::{nymd::error::NymdError, ValidatorClientError}; #[derive(Error, Debug)] pub enum BackendError { #[error("{source}")] TypesError { #[from] source: TypesError, }, #[error("{source}")] Bip39Error { #[from] source: bip39::Error, }, #[error("{source}")] TendermintError { #[from] source: tendermint_rpc::Error, }, #[error("{source}")] NymdError { #[from] source: NymdError, }, #[error("{source}")] CosmwasmStd { #[from] source: cosmwasm_std::StdError, }, #[error("{source}")] ErrorReport { #[from] source: eyre::Report, }, #[error("{source}")] ValidatorApiError { #[from] source: ValidatorAPIError, }, #[error("{source}")] KeyDerivationError { #[from] source: argon2::Error, }, #[error("{source}")] IOError { #[from] source: io::Error, }, #[error("{source}")] SerdeJsonError { #[from] source: serde_json::Error, }, #[error("{source}")] MalformedUrlProvided { #[from] source: url::ParseError, }, #[error("{source}")] ReqwestError { #[from] source: reqwest::Error, }, #[error("failed to encrypt the given data with the provided password")] EncryptionError, #[error("failed to decrypt the given data with the provided password")] DecryptionError, #[error("Client has not been initialized yet, connect with mnemonic to initialize")] ClientNotInitialized, #[error("No balance available for address {0}")] NoBalance(String), #[error("The provided network is not supported (yet)")] NetworkNotSupported(config::defaults::all::Network), #[error("Could not access the local data storage directory")] UnknownStorageDirectory, #[error("The wallet file already exists")] WalletFileAlreadyExists, #[error("The wallet file is not found")] WalletFileNotFound, #[error("Login ID not found in wallet")] WalletNoSuchLoginId, #[error("Account ID not found in wallet login")] WalletNoSuchAccountIdInWalletLogin, #[error("Login ID already found in wallet")] WalletLoginIdAlreadyExists, #[error("Account ID already found in wallet login")] WalletAccountIdAlreadyExistsInWalletLogin, #[error("Mnemonic already found in wallet login, was it already imported?")] WalletMnemonicAlreadyExistsInWalletLogin, #[error("Adding a different password to the wallet not currently supported")] WalletDifferentPasswordDetected, #[error("Unexpected mnemonic account for login")] WalletUnexpectedMnemonicAccount, // #[error("Unexpected multiple account entry for login")] // WalletUnexpectedMultipleAccounts, #[error("Failed to derive address from mnemonic")] FailedToDeriveAddress, #[error("{0}")] ValueParseError(#[from] ParseIntError), #[error("The provided coin has an unknown denomination - {0}")] UnknownCoinDenom(String), #[error("Network {network} doesn't have any associated registered coin denoms")] NoCoinsRegistered { network: Network }, } impl Serialize for BackendError { fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.collect_str(self) } } impl From for BackendError { fn from(e: ValidatorClientError) -> Self { match e { ValidatorClientError::ValidatorAPIError { source } => source.into(), ValidatorClientError::MalformedUrlProvided(e) => e.into(), ValidatorClientError::NymdError(e) => e.into(), } } }