use std::convert::From;
use std::sync::TryLockError;
use failure::Fail;
use rmp_serde::decode::Error as SerdeDecodeError;
use tokio_timer::TimeoutError;
pub type Error = ::failure::Error;
#[derive(Fail, Debug, PartialEq)]
pub enum SaltyError {
#[fail(display = "Crypto error: {}", _0)]
Crypto(String),
#[fail(display = "Decoding error: {}", _0)]
Decode(String),
#[fail(display = "Network error: {}", _0)]
Network(String),
#[fail(display = "Protocol error: {}", _0)]
Protocol(String),
#[fail(display = "No shared task found")]
NoSharedTask,
#[fail(display = "Peer has not (yet) been determined")]
NoPeer,
#[fail(display = "Task error: {}", _0)]
Task(String),
#[fail(
display = "An unexpected error occurred: {}. This indicates a bug and should be reported!",
_0
)]
Crash(String),
#[fail(display = "Future timed out")]
Timeout,
}
impl From<SignalingError> for SaltyError {
fn from(e: SignalingError) -> Self {
match e {
SignalingError::Crash(msg) => SaltyError::Crash(format!("Signaling error: {}", msg)),
SignalingError::Crypto(msg) => SaltyError::Crypto(msg),
SignalingError::CsnOverflow => SaltyError::Crypto(e.to_string()),
SignalingError::Decode(msg) => SaltyError::Decode(msg),
SignalingError::InitiatorCouldNotDecrypt => SaltyError::Crypto(e.to_string()),
SignalingError::InvalidMessage(_) => SaltyError::Protocol(e.to_string()),
SignalingError::InvalidNonce(_) => SaltyError::Protocol(e.to_string()),
SignalingError::InvalidStateTransition(_) => SaltyError::Crash(e.to_string()),
SignalingError::NoSharedTask => SaltyError::NoSharedTask,
SignalingError::NoPeer => SaltyError::NoPeer,
SignalingError::Protocol(msg) => SaltyError::Protocol(msg),
SignalingError::SendError => SaltyError::Network(e.to_string()),
SignalingError::TaskInitialization(_) => SaltyError::Task(e.to_string()),
}
}
}
impl<F> From<TimeoutError<F>> for SaltyError {
fn from(_: TimeoutError<F>) -> Self {
SaltyError::Timeout
}
}
impl<T> From<TryLockError<T>> for SaltyError {
fn from(e: TryLockError<T>) -> Self {
SaltyError::Crash(format!("Could not acquire lock: {}", e))
}
}
pub type SaltyResult<T> = ::std::result::Result<T, SaltyError>;
#[derive(Fail, Debug, PartialEq)]
pub(crate) enum SignalingError {
#[fail(display = "Decoding error: {}", _0)]
Decode(String),
#[fail(display = "Invalid nonce: {}", _0)]
InvalidNonce(String),
#[fail(display = "Crypto error: {}", _0)]
Crypto(String),
#[fail(display = "CSN overflow")]
CsnOverflow,
#[fail(display = "Invalid state transition: {}", _0)]
InvalidStateTransition(String),
#[fail(display = "Invalid message: {}", _0)]
InvalidMessage(String),
#[fail(display = "A protocol error occurred: {}", _0)]
Protocol(String),
#[fail(display = "Server could not relay message")]
SendError,
#[fail(display = "No shared task found")]
NoSharedTask,
#[fail(display = "Peer has not (yet) been determined")]
NoPeer,
#[fail(display = "Task initialization failed: {}", _0)]
TaskInitialization(String),
#[fail(display = "Initiator could not decrypt key message")]
InitiatorCouldNotDecrypt,
#[fail(
display = "An unexpected error occurred: {}. This indicates a bug and should be reported!",
_0
)]
Crash(String),
}
pub(crate) type SignalingResult<T> = ::std::result::Result<T, SignalingError>;
impl From<SerdeDecodeError> for SignalingError {
fn from(e: SerdeDecodeError) -> Self {
SignalingError::Decode(format!("Could not decode msgpack data: {}", e))
}
}
impl<T> From<TryLockError<T>> for SignalingError {
fn from(e: TryLockError<T>) -> Self {
SignalingError::Crash(format!("Could not acquire lock: {}", e))
}
}
#[derive(Fail, Debug, PartialEq)]
pub enum BuilderError {
#[fail(display = "No task specified")]
MissingTask,
}
pub(crate) enum ValidationError {
DropMsg(String),
Fail(String),
Crash(String),
}
impl<T> From<TryLockError<T>> for ValidationError {
fn from(e: TryLockError<T>) -> Self {
ValidationError::Crash(format!("Could not acquire lock: {}", e))
}
}