1use thiserror::Error;
4
5use ironflow_core::error::OperationError;
6use ironflow_store::error::StoreError;
7
8#[derive(Debug, Error)]
10pub enum EngineError {
11 #[error("operation failed: {0}")]
13 Operation(#[from] OperationError),
14
15 #[error("store error: {0}")]
17 Store(#[from] StoreError),
18
19 #[error("invalid workflow: {0}")]
21 InvalidWorkflow(String),
22
23 #[error("step config error: {0}")]
25 StepConfig(String),
26
27 #[error("serialization error: {0}")]
29 Serialization(#[from] serde_json::Error),
30
31 #[error("approval required for run {run_id}, step {step_id}: {message}")]
33 ApprovalRequired {
34 run_id: uuid::Uuid,
36 step_id: uuid::Uuid,
38 message: String,
40 },
41}
42
43#[cfg(test)]
44mod tests {
45 use super::*;
46
47 #[test]
48 fn invalid_workflow_display() {
49 let err = EngineError::InvalidWorkflow("unknown-handler".to_string());
50 assert!(err.to_string().contains("invalid workflow"));
51 assert!(err.to_string().contains("unknown-handler"));
52 }
53
54 #[test]
55 fn step_config_display() {
56 let err = EngineError::StepConfig("bad shell config".to_string());
57 assert!(err.to_string().contains("step config error"));
58 assert!(err.to_string().contains("bad shell config"));
59 }
60
61 #[test]
62 fn store_error_from_conversion() {
63 let store_err = StoreError::RunNotFound(uuid::Uuid::nil());
64 let engine_err = EngineError::from(store_err);
65 assert!(engine_err.to_string().contains("store error"));
66 }
67
68 #[test]
69 fn serialization_error_from_conversion() {
70 let serde_err = serde_json::from_str::<String>("not json").unwrap_err();
71 let engine_err = EngineError::from(serde_err);
72 assert!(engine_err.to_string().contains("serialization error"));
73 }
74}