taskflow_rs/task/
mod.rs

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}