task_tracker_cli/cli/
commands.rs

1/// Command execution logic for CLI
2
3use 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/// Represents a command with its parameters
10#[derive(Debug)]
11pub struct TaskCommand {
12    pub operation: TaskOperation,
13    pub task_id: Option<u32>,
14    pub description: Option<String>,
15}
16
17/// Executes a task command
18pub 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    // Load tasks from storage
23    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    // Execute the operation
39    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    // Save tasks to storage
129    let (task_data, id) = manager.to_json_string();
130    let _ = id_storage.save(id.to_string());
131    let _ = task_storage.save(task_data);
132}