use thiserror::Error;
#[derive(Debug, Error, Clone)]
#[non_exhaustive]
pub enum GraphError {
#[error("Retryable error: {0}")]
Retryable(String),
#[error("Fatal error: {0}")]
Fatal(String),
#[error("Suspended/Yielded: {0}")]
Yield(String),
#[error("Budget exceeded: spent {spent_eur:.4}€ of {limit_eur:.4}€ limit")]
BudgetExceeded { spent_eur: f64, limit_eur: f64 },
}
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum TakelnError {
#[error("Node '{0}' not found in graph registry")]
NodeNotFound(String),
#[error("Checkpoint failure: {0}")]
CheckpointError(String),
#[error("Budget exceeded: spent {spent_eur:.4}€ of {limit_eur:.4}€ limit")]
BudgetExceeded { spent_eur: f64, limit_eur: f64 },
#[error("DAG deadlock — pending nodes with no satisfied dependencies: {0}")]
DAGDeadlock(String),
#[error("JoinSet panic: {0}")]
JoinError(String),
#[error("Execution error: {0}")]
ExecutionError(String),
#[error("Serialization error: {0}")]
SerializationError(String),
#[error("Deserialization error: {0}")]
DeserializationError(String),
#[error("DAG recursion depth {depth} exceeds global cap {limit}")]
RecursionLimitExceeded { depth: u8, limit: u8 },
#[error("Partial wave failure: {succeeded:?} succeeded, {failed:?} failed")]
PartialWaveFailure {
succeeded: Vec<String>,
failed: Vec<(String, String)>,
},
}