use apalis_core::error::BoxDynError;
use petgraph::{algo::Cycle, graph::NodeIndex};
use std::fmt::Debug;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum DagFlowError {
#[error("Node execution error: {0}")]
NodeExecutionError(#[source] BoxDynError),
#[error("Backend error: {0}")]
Backend(#[source] BoxDynError),
#[error("MissingService error: {0:?}")]
MissingService(petgraph::graph::NodeIndex),
#[error("Service error: {0}")]
Service(#[from] DagServiceError),
#[error("Codec error: {0}")]
Codec(#[source] BoxDynError),
#[error("Metadata error: {0}")]
Metadata(#[source] BoxDynError),
#[error("Dependencies not ready")]
DependenciesNotReady,
#[error("Missing task ID for dependency node {0:?}")]
MissingDependencyTaskId(petgraph::graph::NodeIndex),
#[error("Task result not found for node {0:?}")]
TaskResultNotFound(petgraph::graph::NodeIndex),
#[error("Dependency task failed: {0}")]
DependencyTaskFailed(String),
#[error("Unexpected response type during fan-in")]
UnexpectedResponseType,
#[error("Input count mismatch: expected {expected} inputs for fan-in, got {actual}")]
InputCountMismatch {
expected: usize,
actual: usize,
},
#[error("Entry fan-out not completed")]
EntryFanOutIncomplete,
#[error("DAG contains cycles involving nodes: {0:?}")]
CyclicDAG(Cycle<NodeIndex>),
}
#[derive(Error, Debug)]
pub enum DagServiceError {
#[error("DAG encountered a poll error in a service: {0:?}")]
PollError(#[source] BoxDynError),
#[error("Missing previous node")]
MissingPreviousNode,
#[error("Missing Fanin Handler")]
MissingFaninHandler,
#[error("Missing next node")]
MissingNextNode,
#[error("Missing TaskId for incoming node")]
MissingIncomingTaskId,
#[error("Missing result for TaskId {0}")]
MissingTaskIdResult(String),
#[error("Fan-in dependency task returned invalid response")]
InvalidFanInDependencyResult,
#[error("Dependency task failed: {0:?}")]
DependencyTaskFailed(#[source] BoxDynError),
}