mojentic/llm/tools/ephemeral_task_manager/
task.rs

1use serde::{Deserialize, Serialize};
2
3/// Task status following a state machine: Pending → InProgress → Completed
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
5#[serde(rename_all = "snake_case")]
6pub enum TaskStatus {
7    Pending,
8    InProgress,
9    Completed,
10}
11
12impl TaskStatus {
13    pub fn as_str(&self) -> &'static str {
14        match self {
15            TaskStatus::Pending => "pending",
16            TaskStatus::InProgress => "in_progress",
17            TaskStatus::Completed => "completed",
18        }
19    }
20}
21
22/// Represents a task with an identifier, description, and status
23#[derive(Debug, Clone, Serialize, Deserialize)]
24pub struct Task {
25    pub id: usize,
26    pub description: String,
27    pub status: TaskStatus,
28}
29
30impl Task {
31    /// Creates a new task with the given ID and description in Pending status
32    pub fn new(id: usize, description: String) -> Self {
33        Self {
34            id,
35            description,
36            status: TaskStatus::Pending,
37        }
38    }
39}
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44
45    #[test]
46    fn test_task_creation() {
47        let task = Task::new(1, "Test task".to_string());
48        assert_eq!(task.id, 1);
49        assert_eq!(task.description, "Test task");
50        assert_eq!(task.status, TaskStatus::Pending);
51    }
52
53    #[test]
54    fn test_task_status_str() {
55        assert_eq!(TaskStatus::Pending.as_str(), "pending");
56        assert_eq!(TaskStatus::InProgress.as_str(), "in_progress");
57        assert_eq!(TaskStatus::Completed.as_str(), "completed");
58    }
59}