1pub mod definition;
2pub mod handler;
3pub mod result;
4pub mod status;
5
6use chrono::{DateTime, Utc};
7use std::collections::HashMap;
8
9pub use definition::TaskDefinition;
10pub use handler::TaskHandler;
11pub use result::TaskResult;
12pub use status::TaskStatus;
13
14#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
15pub struct Task {
16 pub definition: TaskDefinition,
17 pub status: TaskStatus,
18 pub result: Option<TaskResult>,
19 pub retry_count: u32,
20 pub started_at: Option<DateTime<Utc>>,
21 pub completed_at: Option<DateTime<Utc>>,
22 pub assigned_worker: Option<String>,
23 pub execution_log: Vec<String>,
24}
25
26impl Task {
27 pub fn new(definition: TaskDefinition) -> Self {
28 Self {
29 definition,
30 status: TaskStatus::Pending,
31 result: None,
32 retry_count: 0,
33 started_at: None,
34 completed_at: None,
35 assigned_worker: None,
36 execution_log: Vec::new(),
37 }
38 }
39
40 pub fn start_execution(&mut self, worker_id: &str) {
41 self.status = TaskStatus::Running;
42 self.started_at = Some(Utc::now());
43 self.assigned_worker = Some(worker_id.to_string());
44 self.add_log(&format!("Task started by worker: {}", worker_id));
45 }
46
47 pub fn complete_execution(&mut self, result: TaskResult) {
48 self.status = if result.success {
49 TaskStatus::Completed
50 } else {
51 TaskStatus::Failed
52 };
53 self.result = Some(result);
54 self.completed_at = Some(Utc::now());
55 self.add_log("Task execution completed");
56 }
57
58 pub fn fail_execution(&mut self, error: &str) {
59 self.status = TaskStatus::Failed;
60 self.result = Some(TaskResult {
61 success: false,
62 output: None,
63 error: Some(error.to_string()),
64 execution_time_ms: 0,
65 metadata: HashMap::new(),
66 });
67 self.completed_at = Some(Utc::now());
68 self.add_log(&format!("Task failed: {}", error));
69 }
70
71 pub fn retry(&mut self) {
72 self.retry_count += 1;
73 self.status = TaskStatus::Retrying;
74 self.started_at = None;
75 self.completed_at = None;
76 self.assigned_worker = None;
77 self.add_log(&format!("Task retry attempt: {}", self.retry_count));
78 }
79
80 pub fn cancel(&mut self) {
81 self.status = TaskStatus::Cancelled;
82 self.completed_at = Some(Utc::now());
83 self.add_log("Task cancelled");
84 }
85
86 pub fn can_retry(&self) -> bool {
87 self.retry_count < self.definition.max_retries && self.status.can_retry()
88 }
89
90 pub fn is_ready_to_execute(&self) -> bool {
91 matches!(self.status, TaskStatus::Pending | TaskStatus::Retrying)
92 }
93
94 pub fn is_finished(&self) -> bool {
95 self.status.is_finished()
96 }
97
98 pub fn add_log(&mut self, message: &str) {
99 let timestamp = Utc::now().format("%Y-%m-%d %H:%M:%S UTC");
100 self.execution_log
101 .push(format!("[{}] {}", timestamp, message));
102 }
103}