apalis_workflow/graph/
error.rs1use apalis_core::error::BoxDynError;
2use petgraph::{algo::Cycle, graph::NodeIndex};
3use std::fmt::Debug;
4use thiserror::Error;
5
6use crate::graph::context::GraphFlowContextError;
7
8#[derive(Error, Debug)]
10#[non_exhaustive]
11pub enum GraphFlowError {
12 #[error("Node execution error: {0}")]
14 NodeExecutionError(#[source] BoxDynError),
15 #[error("Backend error: {0}")]
17 Backend(#[source] BoxDynError),
18
19 #[error("MissingService error: {0:?}")]
21 MissingService(petgraph::graph::NodeIndex),
22
23 #[error("Service error: {0}")]
25 Service(#[from] GraphServiceError),
26
27 #[error("Codec error: {0}")]
29 Codec(#[source] BoxDynError),
30
31 #[error("Metadata error: {0}")]
33 Metadata(#[source] BoxDynError),
34
35 #[error("Dependencies not ready")]
37 DependenciesNotReady,
38
39 #[error("Missing task ID for dependency node {0:?}")]
41 MissingDependencyTaskId(petgraph::graph::NodeIndex),
42
43 #[error("Task result not found for node {0:?}")]
45 TaskResultNotFound(petgraph::graph::NodeIndex),
46
47 #[error("Dependency task failed: {0}")]
49 DependencyTaskFailed(String),
50
51 #[error("Unexpected response type during fan-in")]
53 UnexpectedResponseType,
54
55 #[error("Input count mismatch: expected {expected} inputs for fan-in, got {actual}")]
57 InputCountMismatch {
58 expected: usize,
60 actual: usize,
62 },
63 #[error("Entry fan-out not completed")]
65 EntryFanOutIncomplete,
66
67 #[error("Graph contains cycles involving nodes: {0:?}")]
69 CyclicDAG(Cycle<NodeIndex>),
70
71 #[error("Metadata error: {0}")]
73 MetadataError(#[from] GraphFlowContextError),
74}
75
76#[derive(Error, Debug)]
78#[non_exhaustive]
79pub enum GraphServiceError {
80 #[error("Graph encountered a poll error in a service: {0:?}")]
82 PollError(#[source] BoxDynError),
83 #[error("Missing previous node")]
85 MissingPreviousNode,
86 #[error("Missing Fanin Handler")]
88 MissingFaninHandler,
89 #[error("Missing next node")]
91 MissingNextNode,
92 #[error("Missing TaskId for incoming node")]
94 MissingIncomingTaskId,
95 #[error("Missing result for TaskId {0}")]
97 MissingTaskIdResult(String),
98 #[error("Fan-in dependency task returned invalid response")]
100 InvalidFanInDependencyResult,
101
102 #[error("Dependency task failed: {0:?}")]
104 DependencyTaskFailed(#[source] BoxDynError),
105
106 #[error("Codec error: {0}")]
108 Codec(#[source] BoxDynError),
109}