Skip to main content

ironflow_worker/
error.rs

1//! Error types for the background worker.
2
3use thiserror::Error;
4
5use ironflow_core::error::OperationError;
6use ironflow_engine::error::EngineError;
7use ironflow_store::error::StoreError;
8
9/// Errors produced by the worker.
10///
11/// # Examples
12///
13/// ```
14/// use ironflow_worker::error::WorkerError;
15///
16/// let err = WorkerError::Shutdown("worker stopped".to_string());
17/// assert!(err.to_string().contains("shutdown"));
18/// ```
19#[derive(Debug, Error)]
20pub enum WorkerError {
21    /// An operation (Shell, Http, Agent) failed during step execution.
22    #[error("operation error: {0}")]
23    Operation(#[from] OperationError),
24
25    /// The engine returned an error.
26    #[error("engine error: {0}")]
27    Engine(#[from] EngineError),
28
29    /// The store returned an error.
30    #[error("store error: {0}")]
31    Store(#[from] StoreError),
32
33    /// A shutdown-related error.
34    #[error("shutdown error: {0}")]
35    Shutdown(String),
36
37    /// An internal error.
38    #[error("internal error: {0}")]
39    Internal(String),
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn shutdown_error_display() {
48        let err = WorkerError::Shutdown("worker stopped".to_string());
49        let msg = err.to_string();
50        assert!(msg.contains("shutdown error"));
51        assert!(msg.contains("worker stopped"));
52    }
53
54    #[test]
55    fn internal_error_display() {
56        let err = WorkerError::Internal("something went wrong".to_string());
57        let msg = err.to_string();
58        assert!(msg.contains("internal error"));
59        assert!(msg.contains("something went wrong"));
60    }
61
62    #[test]
63    fn shutdown_error_debug() {
64        let err = WorkerError::Shutdown("test".to_string());
65        let debug_str = format!("{:?}", err);
66        assert!(debug_str.contains("Shutdown"));
67    }
68
69    #[test]
70    fn internal_error_debug() {
71        let err = WorkerError::Internal("test".to_string());
72        let debug_str = format!("{:?}", err);
73        assert!(debug_str.contains("Internal"));
74    }
75
76    #[test]
77    fn operation_error_display() {
78        use ironflow_core::error::OperationError;
79        use std::time::Duration;
80
81        let op_err = OperationError::Timeout {
82            step: "shell".to_string(),
83            limit: Duration::from_secs(30),
84        };
85        let err = WorkerError::Operation(op_err);
86        let msg = err.to_string();
87        assert!(msg.contains("operation error"));
88    }
89
90    #[test]
91    fn operation_error_from_impl() {
92        use ironflow_core::error::OperationError;
93        use std::time::Duration;
94
95        let op_err = OperationError::Timeout {
96            step: "agent".to_string(),
97            limit: Duration::from_secs(60),
98        };
99        let err: WorkerError = op_err.into();
100        let msg = err.to_string();
101        assert!(msg.contains("operation error"));
102    }
103
104    #[test]
105    fn engine_error_display() {
106        use ironflow_engine::error::EngineError;
107
108        let engine_err = EngineError::InvalidWorkflow("unknown-handler".to_string());
109        let err = WorkerError::Engine(engine_err);
110        let msg = err.to_string();
111        assert!(msg.contains("engine error"));
112    }
113
114    #[test]
115    fn engine_error_from_impl() {
116        use ironflow_engine::error::EngineError;
117
118        let engine_err = EngineError::StepConfig("bad config".to_string());
119        let err: WorkerError = engine_err.into();
120        let msg = err.to_string();
121        assert!(msg.contains("engine error"));
122    }
123
124    #[test]
125    fn store_error_display() {
126        use ironflow_store::error::StoreError;
127        use uuid::Uuid;
128
129        let store_err = StoreError::RunNotFound(Uuid::nil());
130        let err = WorkerError::Store(store_err);
131        let msg = err.to_string();
132        assert!(msg.contains("store error"));
133    }
134
135    #[test]
136    fn store_error_from_impl() {
137        use ironflow_store::error::StoreError;
138        use uuid::Uuid;
139
140        let store_err = StoreError::StepNotFound(Uuid::nil());
141        let err: WorkerError = store_err.into();
142        let msg = err.to_string();
143        assert!(msg.contains("store error"));
144    }
145
146    #[test]
147    fn operation_error_debug() {
148        use ironflow_core::error::OperationError;
149        use std::time::Duration;
150
151        let op_err = OperationError::Timeout {
152            step: "test".to_string(),
153            limit: Duration::from_secs(30),
154        };
155        let err = WorkerError::Operation(op_err);
156        let debug_str = format!("{:?}", err);
157        assert!(debug_str.contains("Operation"));
158    }
159
160    #[test]
161    fn engine_error_debug() {
162        use ironflow_engine::error::EngineError;
163
164        let engine_err = EngineError::InvalidWorkflow("test".to_string());
165        let err = WorkerError::Engine(engine_err);
166        let debug_str = format!("{:?}", err);
167        assert!(debug_str.contains("Engine"));
168    }
169
170    #[test]
171    fn store_error_debug() {
172        use ironflow_store::error::StoreError;
173        use uuid::Uuid;
174
175        let store_err = StoreError::RunNotFound(Uuid::nil());
176        let err = WorkerError::Store(store_err);
177        let debug_str = format!("{:?}", err);
178        assert!(debug_str.contains("Store"));
179    }
180}