celers_core/lib.rs
1//! `CeleRS` Core - Type-safe distributed task queue library
2//!
3//! This crate provides the core abstractions and types for building
4//! distributed task processing systems in Rust.
5//!
6//! # Quick Start
7//!
8//! ## Basic Task Creation
9//!
10//! ```rust
11//! use celers_core::{SerializedTask, TaskMetadata, TaskState};
12//!
13//! // Create a simple task
14//! let task = SerializedTask::new("process_data".to_string(), vec![1, 2, 3, 4, 5])
15//! .with_priority(5)
16//! .with_max_retries(3)
17//! .with_timeout(60);
18//!
19//! assert_eq!(task.metadata.state, TaskState::Pending);
20//! assert!(task.has_priority());
21//! ```
22//!
23//! ## Task Dependencies and Workflows
24//!
25//! ```rust
26//! use celers_core::{TaskDag, TaskId, SerializedTask};
27//! use uuid::Uuid;
28//!
29//! // Create a DAG for task dependencies
30//! let mut dag = TaskDag::new();
31//!
32//! let load_task = Uuid::new_v4();
33//! let transform_task = Uuid::new_v4();
34//! let save_task = Uuid::new_v4();
35//!
36//! dag.add_node(load_task, "load_data");
37//! dag.add_node(transform_task, "transform_data");
38//! dag.add_node(save_task, "save_results");
39//!
40//! // Define dependencies: transform depends on load, save depends on transform
41//! dag.add_dependency(transform_task, load_task).unwrap();
42//! dag.add_dependency(save_task, transform_task).unwrap();
43//!
44//! // Validate DAG (no cycles)
45//! assert!(dag.validate().is_ok());
46//!
47//! // Get execution order
48//! let order = dag.topological_sort().unwrap();
49//! assert_eq!(order, vec![load_task, transform_task, save_task]);
50//! ```
51//!
52//! ## Retry Strategies
53//!
54//! ```rust
55//! use celers_core::RetryStrategy;
56//!
57//! // Exponential backoff
58//! let strategy = RetryStrategy::exponential(1000, 2.0); // 1s initial, 2x multiplier
59//!
60//! assert_eq!(strategy.calculate_delay(0, None), 1000); // 1s
61//! assert_eq!(strategy.calculate_delay(1, Some(1000)), 2000); // 2s
62//! assert_eq!(strategy.calculate_delay(2, Some(2000)), 4000); // 4s
63//!
64//! // Fixed delay retry strategy
65//! let fixed = RetryStrategy::fixed(5000); // 5 seconds
66//! assert_eq!(fixed.calculate_delay(0, None), 5000);
67//! assert_eq!(fixed.calculate_delay(10, Some(5000)), 5000);
68//! ```
69//!
70//! ## State Tracking
71//!
72//! ```rust
73//! use celers_core::{StateHistory, TaskState};
74//!
75//! let mut history = StateHistory::with_initial(TaskState::Pending);
76//!
77//! // Track state transitions
78//! history.transition(TaskState::Running);
79//! history.transition(TaskState::Succeeded(vec![1, 2, 3]));
80//!
81//! assert_eq!(history.transition_count(), 2);
82//! assert!(history.current_state().unwrap().is_terminal());
83//! ```
84//!
85//! ## Exception Handling
86//!
87//! ```rust
88//! use celers_core::{TaskException, ExceptionCategory, ExceptionPolicy};
89//!
90//! // Create an exception policy
91//! let policy = ExceptionPolicy::new()
92//! .retry_on(&["Temporary*", "Network*"])
93//! .fail_on(&["Fatal*", "Critical*"])
94//! .ignore_on(&["Ignorable*"]);
95//!
96//! // Build an exception
97//! let exception = TaskException::new("TemporaryError", "Connection timeout")
98//! .with_category(ExceptionCategory::Retryable);
99//! ```
100//!
101//! # Core Concepts
102//!
103//! - **Tasks**: Units of work that can be executed asynchronously
104//! - **Brokers**: Message queue backends for task distribution
105//! - **States**: Task lifecycle state machine (Pending → Running → Success/Failure)
106//! - **Dependencies**: DAG-based task dependency management
107//! - **Retries**: Flexible retry strategies with backoff
108//! - **Routing**: Pattern-based task routing to queues
109//! - **Rate Limiting**: Token bucket and sliding window algorithms
110
111pub mod broker;
112pub mod config;
113pub mod control;
114pub mod dag;
115pub mod error;
116pub mod event;
117pub mod exception;
118pub mod executor;
119pub mod rate_limit;
120pub mod result;
121pub mod retry;
122pub mod revocation;
123pub mod router;
124pub mod state;
125pub mod task;
126pub mod time_limit;
127
128pub use broker::{Broker, BrokerMessage};
129pub use config::{
130 BackendTransport, BeatSchedule, BrokerTransport, CeleryConfig, ScheduleDefinition, TaskConfig,
131 TaskRoute,
132};
133pub use control::{
134 ActiveTaskInfo, BrokerStats, ControlCommand, ControlResponse, DeliveryInfo, InspectCommand,
135 InspectResponse, PoolStats, QueueCommand, QueueResponse, QueueStats, RequestInfo,
136 ReservedTaskInfo, ScheduledTaskInfo, WorkerConf, WorkerReport, WorkerStats,
137};
138pub use dag::{DagNode, TaskDag};
139pub use error::{CelersError, Result};
140pub use event::{
141 Alert, AlertCondition, AlertContext, AlertHandler, AlertManager, AlertSeverity,
142 CompositeEventEmitter, Event, EventDispatcher, EventEmitter, EventFilter, EventMonitor,
143 EventReceiver, EventStats, EventStorage, EventStream, FileEventStorage, InMemoryEventEmitter,
144 InMemoryEventStorage, LogLevel, LoggingAlertHandler, LoggingEventEmitter, NoOpEventEmitter,
145 TaskEvent, TaskEventBuilder, WorkerEvent, WorkerEventBuilder,
146};
147pub use exception::{
148 ExceptionAction, ExceptionCategory, ExceptionHandler, ExceptionHandlerChain, ExceptionPolicy,
149 LoggingExceptionHandler, PolicyExceptionHandler, TaskException, TracebackFrame,
150};
151pub use executor::TaskRegistry;
152pub use rate_limit::{
153 create_rate_limiter, DistributedRateLimiter, DistributedRateLimiterCoordinator,
154 DistributedRateLimiterState, DistributedSlidingWindowSpec, DistributedTokenBucketSpec,
155 RateLimitConfig, RateLimiter, SlidingWindow, TaskRateLimiter, TokenBucket, WorkerRateLimiter,
156};
157pub use result::{
158 AsyncResult, ExtendedResultStore, ResultChunk, ResultChunker, ResultCompressor, ResultMetadata,
159 ResultStore, ResultTombstone, TaskResultValue,
160};
161pub use retry::{RetryPolicy, RetryStrategy};
162pub use revocation::{
163 PatternRevocation, RevocationManager, RevocationMode, RevocationRequest, RevocationResult,
164 RevocationState, WorkerRevocationManager,
165};
166pub use router::{
167 ArgumentCondition, GlobPattern, PatternMatcher, RegexPattern, RouteResult, RouteRule, Router,
168 RouterBuilder, RoutingConfig,
169};
170pub use state::{StateHistory, StateTransition, TaskState};
171pub use task::{SerializedTask, Task, TaskId, TaskMetadata};
172pub use time_limit::{
173 TaskTimeLimits, TimeLimit, TimeLimitConfig, TimeLimitExceeded, TimeLimitSettings,
174 TimeLimitStatus, WorkerTimeLimits,
175};