tasky_cli/
commands.rs

1use crate::storage::save_tasks_to_file;
2use crate::task::Task;
3use chrono::DateTime;
4use chrono::offset::Utc;
5use colored::*;
6
7pub fn add_task(tasks: &mut Vec<Task>, text: String, date_string: Option<String>, file: &str) {
8    let date = date_string.unwrap_or_else(|| "".to_string()); // empty if none provided
9    let new_task = Task::new(text.clone(), date.clone());
10    tasks.push(new_task.clone());
11    save_tasks_to_file(tasks, file);
12
13    if date.is_empty() {
14        println!("Added: {}", text.green());
15        println!("Tip: You can also add a due date later using:");
16        println!("   tasky-cli edit <index> \"<new_text>\"  OR");
17        println!("   tasky-cli add \"task\" \"YYYY-MM-DD\"");
18    } else {
19        println!("Added: {} --due {}", text.green(), date.blue());
20    }
21}
22
23pub fn list_tasks(tasks: &[Task]) {
24    if tasks.is_empty() {
25        println!("No tasks yet!");
26    } else {
27        let now: DateTime<Utc> = Utc::now();
28        let current_date = now.format("%Y-%m-%d").to_string();
29
30        for (i, task) in tasks.iter().enumerate() {
31            let status = if task.done { "[X]" } else { "[ ]" };
32
33            if let Some(date) = &task.date_string {
34                let (task_text, date_text) = if current_date > *date {
35                    (task.text.blue(), date.red())
36                } else {
37                    (task.text.blue(), date.yellow())
38                };
39                println!("{}: {} {} due {}", i, status, task_text, date_text);
40            } else {
41                println!("{}: {} {}", i, status, task.text.blue());
42            }
43        }
44    }
45}
46
47pub fn remove_task(tasks: &mut Vec<Task>, index: usize, file: &str) {
48    if index < tasks.len() {
49        let task = tasks.remove(index);
50        save_tasks_to_file(tasks, file);
51        println!("Removed: {}", task.text.red());
52    } else {
53        println!("Error: Invalid index {}", index);
54    }
55}
56
57pub fn done_task(tasks: &mut Vec<Task>, index: usize, file: &str) {
58    if index < tasks.len() {
59        tasks[index].mark_done();
60        save_tasks_to_file(tasks, file);
61        println!("Marked as done: {}", tasks[index].text.green());
62    } else {
63        println!("Error: Invalid index {}", index);
64    }
65}
66
67pub fn edit_task(tasks: &mut Vec<Task>, index: usize, new_text: String, file: &str) {
68    if index < tasks.len() {
69        let old_text = tasks[index].text.clone();
70        tasks[index].text = new_text.clone();
71        save_tasks_to_file(tasks, file);
72        println!(
73            "Edited task {}: '{}' -> '{}'",
74            index,
75            old_text.yellow(),
76            new_text.green()
77        );
78    } else {
79        println!("Error: Invalid index {index}");
80    }
81}