Skip to main content

dag_executor/
lib.rs

1//! # dag-executor
2//!
3//! A production-ready DAG (directed acyclic graph) executor with stateful task
4//! execution, file-based persistence and recovery, advanced workflow patterns
5//! (conditional, fan-out/fan-in, loops, event-driven), and fault-tolerance
6//! primitives (circuit breaker, retries, dead-letter queue).
7//!
8//! ## Quick start
9//!
10//! ```no_run
11//! use std::sync::Arc;
12//! use dag_executor::prelude::*;
13//!
14//! # async fn run() -> anyhow::Result<()> {
15//! let mut dag = Dag::new();
16//! dag.add_task(Arc::new(BasicTask::new("a", |_ctx| async { Ok(serde_json::json!(1)) })))?;
17//! dag.add_task(Arc::new(
18//!     BasicTask::new("b", |_ctx| async { Ok(serde_json::json!(2)) }).with_deps(["a"]),
19//! ))?;
20//!
21//! let executor = DagExecutor::builder().build();
22//! let report = executor.run(dag).await?;
23//! assert!(report.is_success());
24//! # Ok(())
25//! # }
26//! ```
27//!
28//! See the [`prelude`] module for the most commonly used types.
29#![cfg_attr(docsrs, feature(doc_cfg))]
30#![warn(missing_docs)]
31#![warn(rustdoc::broken_intra_doc_links)]
32
33pub mod advanced;
34pub mod context;
35pub mod dag;
36pub mod error;
37pub mod metrics;
38pub mod state;
39pub mod storage;
40pub mod tasks;
41pub mod utils;
42
43/// Common imports for working with the executor.
44pub mod prelude {
45    pub use crate::advanced::{
46        patterns, Backoff, CircuitBreaker, CircuitState, DeadLetterQueue, RetryPolicy,
47    };
48    pub use crate::context::Context;
49    pub use crate::dag::{Dag, DagExecutor, DagExecutorBuilder, ExecutionReport};
50    pub use crate::error::{DagExecutorError, Result, StorageError, TaskError, ValidationError};
51    pub use crate::state::{TaskRecord, TaskState};
52    pub use crate::storage::{Cache, FileStorage, MemoryStorage, Storage};
53    pub use crate::tasks::{
54        BasicTask, ConditionalTask, EventDrivenTask, LoopTask, StatefulTask, Task,
55    };
56    pub use crate::utils::Config;
57}