use thiserror::Error;
#[derive(Debug, Error)]
pub enum ExecutionError {
#[error("Plan building failed: {0}")]
PlanError(String),
#[error("Step failed: {0}")]
StepFailed(String),
#[error("Tests failed: {0} failures")]
TestsFailed(usize),
#[error("Rollback failed: {0}")]
RollbackFailed(String),
#[error("Approval denied")]
ApprovalDenied,
#[error("Validation error: {0}")]
ValidationError(String),
#[error("Configuration error: {0}")]
ConfigError(String),
#[error("IO error: {0}")]
IoError(#[from] std::io::Error),
#[error("Serialization error: {0}")]
SerializationError(String),
#[error("Timeout after {0}ms")]
Timeout(u64),
#[error("State persistence error: {0}")]
StatePersistenceError(String),
}
impl PartialEq for ExecutionError {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(ExecutionError::PlanError(a), ExecutionError::PlanError(b)) => a == b,
(ExecutionError::StepFailed(a), ExecutionError::StepFailed(b)) => a == b,
(ExecutionError::TestsFailed(a), ExecutionError::TestsFailed(b)) => a == b,
(ExecutionError::RollbackFailed(a), ExecutionError::RollbackFailed(b)) => a == b,
(ExecutionError::ApprovalDenied, ExecutionError::ApprovalDenied) => true,
(ExecutionError::ValidationError(a), ExecutionError::ValidationError(b)) => a == b,
(ExecutionError::ConfigError(a), ExecutionError::ConfigError(b)) => a == b,
(ExecutionError::SerializationError(a), ExecutionError::SerializationError(b)) => {
a == b
}
(ExecutionError::Timeout(a), ExecutionError::Timeout(b)) => a == b,
(
ExecutionError::StatePersistenceError(a),
ExecutionError::StatePersistenceError(b),
) => a == b,
(ExecutionError::IoError(a), ExecutionError::IoError(b)) => a.kind() == b.kind(),
_ => false,
}
}
}
pub type ExecutionResult<T> = Result<T, ExecutionError>;