|
@@ -0,0 +1,120 @@
|
|
|
|
+use serde::{Deserialize, Serialize};
|
|
|
|
+use serde_json;
|
|
|
|
+use std::fs::{self, File};
|
|
|
|
+use std::io::{self, Write};
|
|
|
|
+#[derive(Serialize, Deserialize, Debug)]
|
|
|
|
+struct Task {
|
|
|
|
+ id: usize,
|
|
|
|
+ description: String,
|
|
|
|
+ completed: bool,
|
|
|
|
+}
|
|
|
|
+fn main() {
|
|
|
|
+ let mut tasks: Vec<Task> = load_tasks();
|
|
|
|
+ loop {
|
|
|
|
+ println!("\n To-Do List Menu");
|
|
|
|
+ println!("1. Add Task");
|
|
|
|
+ println!("2. View Tasks");
|
|
|
|
+ println!("3. Mark Task as Completed");
|
|
|
|
+ println!("4. Delete Task");
|
|
|
|
+ println!("5. Exit");
|
|
|
|
+ let choice = get_input("Enter your choice: ");
|
|
|
|
+ match choice.as_str() {
|
|
|
|
+ "1" => add_task(&mut tasks),
|
|
|
|
+ "2" => view_tasks(&tasks),
|
|
|
|
+ "3" => mark_task_completed(&mut tasks),
|
|
|
|
+ "4" => delete_task(&mut tasks),
|
|
|
|
+ "5" => {
|
|
|
|
+ save_tasks(&tasks);
|
|
|
|
+ println!("Tasks saved. Exiting...");
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ _ => println!("Invalid choice, please try again."),
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+fn get_input(prompt: &str) -> String {
|
|
|
|
+ print!("{}", prompt);
|
|
|
|
+ io::stdout().flush().unwrap();
|
|
|
|
+ let mut input = String::new();
|
|
|
|
+ io::stdin()
|
|
|
|
+ .read_line(&mut input)
|
|
|
|
+ .expect("Failed to read line");
|
|
|
|
+ input.trim().to_string()
|
|
|
|
+}
|
|
|
|
+fn add_task(tasks: &mut Vec<Task>) {
|
|
|
|
+ let description = get_input("Enter task description: ");
|
|
|
|
+ let id = tasks.len() + 1;
|
|
|
|
+ let new_task = Task {
|
|
|
|
+ id,
|
|
|
|
+ description,
|
|
|
|
+ completed: false,
|
|
|
|
+ };
|
|
|
|
+ tasks.push(new_task);
|
|
|
|
+ println!("Task added successfully.");
|
|
|
|
+}
|
|
|
|
+fn view_tasks(tasks: &Vec<Task>) {
|
|
|
|
+ if tasks.is_empty() {
|
|
|
|
+ println!("No tasks available.");
|
|
|
|
+ } else {
|
|
|
|
+ for task in tasks {
|
|
|
|
+ let status = if task.completed {
|
|
|
|
+ "Completed"
|
|
|
|
+ } else {
|
|
|
|
+ "Pending"
|
|
|
|
+ };
|
|
|
|
+ println!(
|
|
|
|
+ "ID: {}, Description: {}, Status: {}",
|
|
|
|
+ task.id, task.description, status
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+//load tasks from file
|
|
|
|
+fn load_tasks() -> Vec<Task> {
|
|
|
|
+ match fs::read_to_string("tasks.json") {
|
|
|
|
+ Ok(content) => serde_json::from_str(&content).unwrap_or_else(|_| Vec::<Task>::new()),
|
|
|
|
+ Err(_) => Vec::new(),
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+//save tasks to file
|
|
|
|
+fn save_tasks(tasks: &Vec<Task>) {
|
|
|
|
+ let serialized = serde_json::to_string_pretty(tasks).expect("Failed to serialize tasks");
|
|
|
|
+ let mut file = File::create("tasks.json").expect("Failed to create file");
|
|
|
|
+ file.write_all(serialized.as_bytes())
|
|
|
|
+ .expect("Failed to write tasks to file");
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+//Mark task as completed
|
|
|
|
+fn mark_task_completed(tasks: &mut Vec<Task>) {
|
|
|
|
+ let id_input = get_input("Enter task ID to mark as completed: ");
|
|
|
|
+ if let Ok(id) = id_input.parse::<usize>() {
|
|
|
|
+ if let Some(task) = tasks.iter_mut().find(|t| t.id == id) {
|
|
|
|
+ task.completed = true;
|
|
|
|
+ println!("Task marked as completed.");
|
|
|
|
+ } else {
|
|
|
|
+ println!("Task with ID {} not found.", id);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ println!("Invalid ID input.");
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+//Delete task
|
|
|
|
+fn delete_task(tasks: &mut Vec<Task>) {
|
|
|
|
+ let id_input = get_input("Enter task ID to delete: ");
|
|
|
|
+ if let Ok(id) = id_input.parse::<usize>() {
|
|
|
|
+ if let Some(pos) = tasks.iter().position(|t| t.id == id) {
|
|
|
|
+ let removed_task = tasks.remove(pos);
|
|
|
|
+ println!("Task '{}' deleted successfully.", removed_task.description);
|
|
|
|
+
|
|
|
|
+ // Re-index remaining tasks to maintain sequential IDs
|
|
|
|
+ for (index, task) in tasks.iter_mut().enumerate() {
|
|
|
|
+ task.id = index + 1;
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ println!("Task with ID {} not found.", id);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ println!("Invalid ID input.");
|
|
|
|
+ }
|
|
|
|
+}
|