use thiserror::Error;
use ironflow_core::error::OperationError;
use ironflow_store::error::StoreError;
#[derive(Debug, Error)]
pub enum EngineError {
#[error("operation failed: {0}")]
Operation(#[from] OperationError),
#[error("store error: {0}")]
Store(#[from] StoreError),
#[error("invalid workflow: {0}")]
InvalidWorkflow(String),
#[error("step config error: {0}")]
StepConfig(String),
#[error("serialization error: {0}")]
Serialization(#[from] serde_json::Error),
#[error("approval required for run {run_id}, step {step_id}: {message}")]
ApprovalRequired {
run_id: uuid::Uuid,
step_id: uuid::Uuid,
message: String,
},
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn invalid_workflow_display() {
let err = EngineError::InvalidWorkflow("unknown-handler".to_string());
assert!(err.to_string().contains("invalid workflow"));
assert!(err.to_string().contains("unknown-handler"));
}
#[test]
fn step_config_display() {
let err = EngineError::StepConfig("bad shell config".to_string());
assert!(err.to_string().contains("step config error"));
assert!(err.to_string().contains("bad shell config"));
}
#[test]
fn store_error_from_conversion() {
let store_err = StoreError::RunNotFound(uuid::Uuid::nil());
let engine_err = EngineError::from(store_err);
assert!(engine_err.to_string().contains("store error"));
}
#[test]
fn serialization_error_from_conversion() {
let serde_err = serde_json::from_str::<String>("not json").unwrap_err();
let engine_err = EngineError::from(serde_err);
assert!(engine_err.to_string().contains("serialization error"));
}
}