use std::error::Error;
use std::fmt;
#[derive(Debug)]
pub enum ExecutorError<E>
where
E: fmt::Display,
{
TaskFailed(E),
PrepareFailed(String),
PrepareCommitFailed(String),
PrepareRollbackFailed {
original: String,
rollback: String,
},
LockPoisoned(String),
}
impl<E> fmt::Display for ExecutorError<E>
where
E: fmt::Display,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ExecutorError::TaskFailed(e) => {
write!(f, "Task execution failed: {}", e)
}
ExecutorError::PrepareFailed(msg) => {
write!(f, "Preparation action failed: {}", msg)
}
ExecutorError::PrepareCommitFailed(msg) => {
write!(f, "Prepare commit action failed: {}", msg)
}
ExecutorError::PrepareRollbackFailed { original, rollback } => {
write!(
f,
"Prepare rollback failed: original error = {}, rollback error = {}",
original, rollback
)
}
ExecutorError::LockPoisoned(msg) => {
write!(f, "Lock poisoned: {}", msg)
}
}
}
}
impl<E> Error for ExecutorError<E> where E: fmt::Display + fmt::Debug {}