1 unstable release
Uses new Rust 2024
| 0.1.0 | Sep 17, 2025 |
|---|
#6 in #todo-cli
62KB
1.5K
SLoC
📝 Todo CLI
A simple "Todo List Manager" written in Rust. Supports both an interactive menu and a command-line interface (CLI).
✨ Features
- Add, list, update, search, and delete todos
- Store todos in a JSON file (
todos.json) - Interactive menu mode (
--menu) for guided use - CLI for quick commands
- Desktop notifications for due/overdue tasks (
todo notify) - Todos have:
- Unique ID (UUID)
- Title & optional description
- Priority: High | Medium | Low
- Status: Pending | In Progress | Done
- Creation timestamp
- Optional due date (UTC) and tags
- Optional recurrence: Daily | Weekly | Custom("...")
- Optional parent/subtasks relationships
🚀 Installation
Clone the repository and install the binary locally:
git clone https://github.com/leocm889/todo_list.git
cd todo_list
cargo install --path .
This will install the binary to ~/.cargo/bin/todo.
Make sure ~/.cargo/bin is in your $PATH.
🖥️ Usage
1. Interactive Menu Mode
Launch the program with a text-based menu:
todo --menu
# or while developing
cargo run -- --menu
You'll see options like:
1. Add a Task
2. View Tasks
3. Search Tasks
4. Update Tasks
5. Delete Tasks
6. Exit Program
2. Command-Line Mode
Use direct commands without the menu:
Add a todo
# Flags for add:
# -t/--title (required), -d/--description, -p/--priority, -s/--status,
# -D/--due-date (YYYY-MM-DD), -r/--recurrence, -g/--tags, -P/--parent-id, -u/--subtasks
todo add -t "Buy milk" -d "From the store" -p high -s pending -D 2025-09-20 -g groceries,errands
View todos
# --sort-by created|priority|status|due-date|overdue (default: created)
todo list --sort-by due-date
Search by title
todo search --title "milk"
Search by ID
todo search --id <UUID>
Search by priority
todo search --priority high
Search by status
todo search --status done
Search by due date
todo search --due-date 2025-09-20
Search by tags (comma separated)
todo search --tags work,urgent
Update a todo
# Update uses flags like add, but all are optional except --id
todo update --id <UUID> -t "Buy bread" -s in_progress -D 2025-09-21
Delete a todo
todo delete --id <UUID>
Send desktop notifications
# Shows notifications for tasks due now or overdue
todo notify
Notes:
- On Linux, ensure a notification daemon is running (e.g., GNOME/KDE notifier, dunst).
📂 Project Structure
src/
├── main.rs # CLI entry point (clap) and command dispatch, handles --menu
├── lib.rs # Library exports and helpers used by tests
├── cli.rs # Clap command definitions
├── input.rs # DTOs for CLI to core (Add/Update/Search input structs)
├── menu.rs # Interactive menu UI (stdin-driven)
├── todo.rs # Todo model + Display + interactive helpers
├── todo_cli.rs # Non-interactive CLI handlers (add/list/search/update/delete)
├── storage.rs # JSON persistence (load/save)
├── notify.rs # Desktop notifications for due/overdue tasks
├── priority.rs # Priority enum + Display
├── status.rs # Status enum + Display
├── recurrence.rs # Recurrence enum + Display/FromStr (Daily/Weekly/Custom)
├── utils.rs # Input helpers
└── tests/ # Integration tests
📊 Example JSON Output
{
"b5a9a9c2-6f5a-4b2e-91e1-8e44c0d6c123": {
"id": "b5a9a9c2-6f5a-4b2e-91e1-8e44c0d6c123",
"title": "Buy milk",
"description": "From the supermarket",
"priority": "High",
"status": "Pending",
"created_at": "2025-09-04T12:34:56",
"due_date": "2025-09-20T00:00:00Z",
"tags": ["groceries", "errands"],
"recurrence": null,
"parent_id": null,
"subtasks": []
},
"e1c2a3f4-1d2e-4c5b-8f6a-7d8c9b0e1234": {
"id": "e1c2a3f4-1d2e-4c5b-8f6a-7d8c9b0e1234",
"title": "Finish Rust project",
"description": "Work on todo-cli",
"priority": "Medium",
"status": "InProgress",
"created_at": "2025-09-04T13:10:42"
}
}
✍️ Author
- leocm889
Dependencies
~3–24MB
~403K SLoC