task_tracker_cli/cli/
commands.rs1use crate::task::TaskManager;
4use crate::storage::{Storage, FileStorage};
5use crate::ui::{display_task, display_tasks};
6use crate::cli::TaskOperation;
7use tracing::{info, error, debug};
8
9#[derive(Debug)]
11pub struct TaskCommand {
12 pub operation: TaskOperation,
13 pub task_id: Option<u32>,
14 pub description: Option<String>,
15}
16
17pub fn execute_command(command: TaskCommand, storage_path: String) {
19 let id_storage = FileStorage::new(Some("temp/id".to_string()));
20 let task_storage = FileStorage::new(Some(storage_path));
21
22 let store_content = task_storage
24 .load()
25 .unwrap_or_else(|_| "[]".to_string());
26
27 let current_id = id_storage
28 .load()
29 .unwrap_or_else(|_| "0".to_string())
30 .parse::<u32>()
31 .unwrap_or(0);
32
33 debug!("Loading tasks (current_id={})", current_id);
34
35 let mut manager = TaskManager::from_json_string(&store_content, current_id)
36 .unwrap_or_else(|| TaskManager::new());
37
38 match command.operation {
40 TaskOperation::Add => {
41 if let Some(desc) = command.description {
42 manager.add_task(desc.clone());
43 info!("✓ Task added: \"{}\"", desc);
44 if let Some(task) = manager.tasks.last() {
45 debug!("Task ID: {}", task.id);
46 }
47 } else {
48 error!("❌ Error: Description required for adding a task");
49 }
50 }
51
52 TaskOperation::Delete => {
53 if let Some(id) = command.task_id {
54 manager.remove_task(id);
55 info!("✓ Task {} deleted", id);
56 debug!("Remaining tasks: {}", manager.tasks.len());
57 } else {
58 error!("❌ Error: Task ID required for deletion");
59 }
60 }
61
62 TaskOperation::MarkInProgress => {
63 if let Some(id) = command.task_id {
64 if let Some(task) = manager.get_task_mut(id) {
65 task.mark_in_progress();
66 info!("✓ Task {} marked as In Progress", id);
67 debug!("Task status updated at: {}", task.updated_at);
68 } else {
69 error!("❌ Error: Task {} not found", id);
70 }
71 } else {
72 error!("❌ Error: Task ID required");
73 }
74 }
75
76 TaskOperation::MarkDone => {
77 if let Some(id) = command.task_id {
78 if let Some(task) = manager.get_task_mut(id) {
79 task.mark_done();
80 info!("✓ Task {} marked as Done", id);
81 debug!("Task status updated at: {}", task.updated_at);
82 } else {
83 error!("❌ Error: Task {} not found", id);
84 }
85 } else {
86 error!("❌ Error: Task ID required");
87 }
88 }
89
90 TaskOperation::UpdateDesc => {
91 if let Some(id) = command.task_id {
92 if let Some(desc) = command.description {
93 if let Some(task) = manager.get_task_mut(id) {
94 let old_desc = task.description.clone();
95 task.update(desc.clone());
96 info!("✓ Task {} updated: \"{}\" → \"{}\"", id, old_desc, desc);
97 debug!("Task status updated at: {}", task.updated_at);
98 } else {
99 error!("❌ Error: Task {} not found", id);
100 }
101 } else {
102 error!("❌ Error: Description required for update");
103 }
104 } else {
105 error!("❌ Error: Task ID required");
106 }
107 }
108
109 TaskOperation::Get => {
110 if let Some(id) = command.task_id {
111 if let Some(task) = manager.get_task(id) {
112 debug!("Retrieving task with ID: {}", id);
113 display_task(task);
114 } else {
115 error!("❌ Error: Task {} not found", id);
116 }
117 } else {
118 error!("❌ Error: Task ID required");
119 }
120 }
121
122 TaskOperation::List => {
123 debug!("Listing all tasks (Total: {})", manager.tasks.len());
124 display_tasks(&manager.tasks);
125 }
126 }
127
128 let (task_data, id) = manager.to_json_string();
130 let _ = id_storage.save(id.to_string());
131 let _ = task_storage.save(task_data);
132}