use sn_data_types::{Error as DtError, PublicKey};
use sn_messaging::{client::Error as ErrorMessage, MessageId};
use std::io;
use thiserror::Error;
#[allow(clippy::large_enum_variant)]
#[derive(Error, Debug)]
#[non_exhaustive]
pub enum Error {
#[error("Balance already exists.")]
BalanceExists,
#[error("Not enough space")]
NotEnoughSpace,
#[error("Node not found")]
NodeNotFound,
#[error("No such chunk")]
NoSuchChunk,
#[error("Could not create temp store: {0}")]
TempDirCreationFailed(String),
#[error("Could not fetch StoreId")]
NoStoreId,
#[error("Could not combine signatures")]
CouldNotCombineSignatures,
#[error("Data already exists at this node")]
DataExists,
#[error("I/O error: {0}")]
Io(#[from] io::Error),
#[error("JSON serialisation error:: {0}")]
JsonSerialisation(#[from] serde_json::Error),
#[error("Bincode error:: {0}")]
Bincode(#[from] bincode::Error),
#[error("Client message error:: {0}")]
ClientMessage(#[from] sn_messaging::client::Error),
#[error("Network message error:: {0}")]
Message(#[from] sn_messaging::Error),
#[error("PickleDb error:: {0}")]
PickleDb(#[from] pickledb::error::Error),
#[error("Network data error:: {0}")]
NetworkData(#[from] sn_data_types::Error),
#[error("Transfer data error:: {0}")]
Transfer(#[from] sn_transfers::Error),
#[error("Routing error:: {0}")]
Routing(#[from] sn_routing::Error),
#[error("Onboarding error")]
Onboarding,
#[error("Transfer has already been registered")]
TransferAlreadyRegistered,
#[error("Signed transfer for Dot: '{0:?}' is not valid. Debit or credit are missing")]
InvalidSignedTransfer(crdts::Dot<PublicKey>),
#[error("Propagated Credit Agreement proof is not valid. Proof received: {0:?}")]
InvalidPropagatedTransfer(sn_data_types::CreditAgreementProof),
#[error("Message with id: '{0:?}' is invalid. {1}")]
InvalidMessage(MessageId, String),
#[error("Provided PublicKey is not a valid owner. Provided PublicKey: {0}")]
InvalidOwners(PublicKey),
#[error("Invalid operation")]
InvalidOperation(String),
#[error("No mapping to sn_messages error is set up for this NodeError {0}")]
NoErrorMapping(String),
#[error("Logic error: {0}")]
Logic(String),
}
pub(crate) fn convert_to_error_message(error: Error) -> Result<sn_messaging::client::Error> {
match error {
Error::InvalidOperation(_msg) => Ok(ErrorMessage::InvalidOperation),
Error::InvalidOwners(key) => Ok(ErrorMessage::InvalidOwners(key)),
Error::InvalidSignedTransfer(_) => Ok(ErrorMessage::InvalidSignature),
Error::TransferAlreadyRegistered => Ok(ErrorMessage::TransactionIdExists),
Error::NoSuchChunk => Ok(ErrorMessage::NoSuchData),
Error::NotEnoughSpace => Ok(ErrorMessage::NotEnoughSpace),
Error::BalanceExists => Ok(ErrorMessage::BalanceExists),
Error::TempDirCreationFailed(_) => Ok(ErrorMessage::FailedToWriteFile),
Error::DataExists => Ok(ErrorMessage::DataExists),
Error::NetworkData(error) => convert_dt_error_to_error_message(error),
error => Err(Error::NoErrorMapping(error.to_string())),
}
}
pub(crate) fn convert_dt_error_to_error_message(
error: DtError,
) -> Result<sn_messaging::client::Error> {
match error {
DtError::InvalidOperation => Ok(ErrorMessage::InvalidOperation),
DtError::PolicyNotSet => Ok(ErrorMessage::PolicyNotSet),
DtError::NoSuchEntry => Ok(ErrorMessage::NoSuchEntry),
DtError::CrdtUnexpectedState => Ok(ErrorMessage::CrdtUnexpectedState),
DtError::OpNotCausallyReady => Ok(ErrorMessage::OpNotCausallyReady),
DtError::AccessDenied(pk) => Ok(ErrorMessage::AccessDenied(pk)),
error => Err(Error::NoErrorMapping(error.to_string())),
}
}
pub type Result<T, E = Error> = std::result::Result<T, E>;