Skip to main content

apalis_workflow/graph/
error.rs

1use 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/// Errors that can occur during Graph workflow execution.
9#[derive(Error, Debug)]
10#[non_exhaustive]
11pub enum GraphFlowError {
12    /// An error originating from the actual node execution.
13    #[error("Node execution error: {0}")]
14    NodeExecutionError(#[source] BoxDynError),
15    /// An error originating from the backend.
16    #[error("Backend error: {0}")]
17    Backend(#[source] BoxDynError),
18
19    /// An error originating from the service.
20    #[error("MissingService error: {0:?}")]
21    MissingService(petgraph::graph::NodeIndex),
22
23    /// An error originating from the service.
24    #[error("Service error: {0}")]
25    Service(#[from] GraphServiceError),
26
27    /// An error related to codec operations.
28    #[error("Codec error: {0}")]
29    Codec(#[source] BoxDynError),
30
31    /// An error related to metadata operations.
32    #[error("Metadata error: {0}")]
33    Metadata(#[source] BoxDynError),
34
35    /// An error indicating that dependencies are not ready.
36    #[error("Dependencies not ready")]
37    DependenciesNotReady,
38
39    /// An error indicating a missing task ID for a dependency node.
40    #[error("Missing task ID for dependency node {0:?}")]
41    MissingDependencyTaskId(petgraph::graph::NodeIndex),
42
43    /// An error indicating that a task result was not found for a node.
44    #[error("Task result not found for node {0:?}")]
45    TaskResultNotFound(petgraph::graph::NodeIndex),
46
47    /// An error indicating that a dependency task has failed.
48    #[error("Dependency task failed: {0}")]
49    DependencyTaskFailed(String),
50
51    /// An error indicating an unexpected response type during fan-in.
52    #[error("Unexpected response type during fan-in")]
53    UnexpectedResponseType,
54
55    /// An error indicating a mismatch in the number of inputs during fan-in.
56    #[error("Input count mismatch: expected {expected} inputs for fan-in, got {actual}")]
57    InputCountMismatch {
58        /// The expected number of inputs.
59        expected: usize,
60        /// The actual number of inputs received.
61        actual: usize,
62    },
63    /// An error indicating that entry fan-out is not completed.
64    #[error("Entry fan-out not completed")]
65    EntryFanOutIncomplete,
66
67    /// Graph contains cycles.
68    #[error("Graph contains cycles involving nodes: {0:?}")]
69    CyclicDAG(Cycle<NodeIndex>),
70
71    /// Metadata error
72    #[error("Metadata error: {0}")]
73    MetadataError(#[from] GraphFlowContextError),
74}
75
76/// Error encountered during execution
77#[derive(Error, Debug)]
78#[non_exhaustive]
79pub enum GraphServiceError {
80    /// Graph service poll error.
81    #[error("Graph encountered a poll error in a service: {0:?}")]
82    PollError(#[source] BoxDynError),
83    /// Missing previous node
84    #[error("Missing previous node")]
85    MissingPreviousNode,
86    /// Missing Fanin Handler
87    #[error("Missing Fanin Handler")]
88    MissingFaninHandler,
89    /// Missing next node
90    #[error("Missing next node")]
91    MissingNextNode,
92    /// Missing TaskId for incoming node
93    #[error("Missing TaskId for incoming node")]
94    MissingIncomingTaskId,
95    /// Missing result for TaskId
96    #[error("Missing result for TaskId {0}")]
97    MissingTaskIdResult(String),
98    /// Dependency task returned invalid response, which is unexpected during fan-in
99    #[error("Fan-in dependency task returned invalid response")]
100    InvalidFanInDependencyResult,
101
102    /// Dependency task failed
103    #[error("Dependency task failed: {0:?}")]
104    DependencyTaskFailed(#[source] BoxDynError),
105
106    /// An error related to codec operations.
107    #[error("Codec error: {0}")]
108    Codec(#[source] BoxDynError),
109}