1+ mod commands;
2+ mod models;
3+ mod storage;
14
2- use clap:: { Parser , Subcommand } ;
3- use serde:: { Serialize , Deserialize } ;
4- use std:: fs:: { File , OpenOptions } ;
5- use std:: io:: { BufReader , BufWriter } ;
6- use std:: path:: Path ;
5+ use commands:: { add, complete, delete, list} ;
76
8- const DATA_FILE : & str = "data/tasks.json" ;
7+ use clap :: { Parser , Subcommand } ;
98
10- #[ derive( Parser ) ]
9+ #[ derive( Parser , Debug ) ]
1110#[ command( name = "Smart Tasker" ) ]
1211#[ command( about = "CLI to manage tasks" ) ]
1312#[ command( version) ]
1413#[ command( author = "Adarsh" ) ]
15- struct Cli {
14+ struct Cli {
1615 #[ command( subcommand) ]
17- command : Commands
16+ command : Option < Commands > ,
1817}
1918
20- #[ derive( Subcommand ) ]
21- enum Commands {
19+ #[ derive( Subcommand , Debug ) ]
20+ enum Commands {
2221 Add { desc : String } ,
2322 List ,
24- Completed { id : usize } ,
25- Delete { id : usize }
26- }
27-
28- #[ derive( Serialize , Deserialize , Debug , Clone ) ]
29- struct Task {
30- desc : String ,
31- completed : bool
23+ Complete { id : usize } ,
24+ Delete { id : usize } ,
3225}
3326
34- fn main ( ) {
27+ fn main ( ) {
3528 let cli = Cli :: parse ( ) ;
3629
37- match cli. command {
38- Commands :: Add { desc } => {
39- let mut tasks = load_tasks ( ) ;
40- tasks. push ( Task {
41- desc,
42- completed : false
43- } ) ;
44- save_tasks ( & tasks) ;
45- println ! ( "Task added" ) ;
46- show_tasks ( ) ;
47- } ,
48- Commands :: List => {
49- show_tasks ( ) ;
50- } ,
51- Commands :: Completed { id } => {
52- let mut tasks = load_tasks ( ) ;
53- if id == 0 || id > tasks. len ( ) {
54- println ! ( "Invalid task ID" ) ;
55- show_tasks ( ) ;
56- return ;
57- }
58- let index = id - 1 ;
59- tasks[ index] . completed = true ;
60- save_tasks ( & tasks) ;
61- show_tasks ( ) ;
62- } ,
63- Commands :: Delete { id } => {
64- let mut tasks = load_tasks ( ) ;
65- if id == 0 || id > tasks. len ( ) {
66- println ! ( "Invalid input, nothing was deleted, \n Try Again" ) ;
67- show_tasks ( ) ;
68- return ;
69- }
70- let index = id - 1 ;
71- tasks = tasks. into_iter ( ) . enumerate ( ) . filter ( |( i, _) | * i != index) . map ( |( _, task) |task) . collect ( ) ;
72- save_tasks ( & tasks) ;
73- let deleted = & tasks[ index] . desc ;
74- println ! ( "Deleted {:?} successfully" , deleted) ;
75- show_tasks ( ) ;
30+ match cli. command {
31+ Some ( Commands :: Add { desc } ) => add ( desc) ,
32+ Some ( Commands :: List ) => list ( ) ,
33+ Some ( Commands :: Complete { id } ) => complete ( id) ,
34+ Some ( Commands :: Delete { id } ) => delete ( id) ,
35+ None => {
36+ eprintln ! ( "No command given. Use `--help` to see help" ) ;
7637 }
7738 }
7839}
79-
80- fn load_tasks ( ) -> Vec < Task > {
81- if !Path :: new ( DATA_FILE ) . exists ( ) {
82- return Vec :: new ( )
83- }
84-
85- let file = File :: open ( DATA_FILE ) . expect ( "failed to open DATA_FILE" ) ;
86- let reader = BufReader :: new ( file) ;
87- serde_json:: from_reader ( reader) . unwrap_or_else ( |_| Vec :: new ( ) )
88- }
89-
90- fn save_tasks ( tasks : & Vec < Task > ) {
91- let file = OpenOptions :: new ( )
92- . create ( true )
93- . write ( true )
94- . truncate ( true )
95- . open ( DATA_FILE )
96- . expect ( "failed to write file" ) ;
97-
98- let writer = BufWriter :: new ( file) ;
99- serde_json:: to_writer_pretty ( writer, tasks) . expect ( "Failed to serialise task" ) ;
100- }
101-
102- fn show_tasks ( ) {
103- let tasks = load_tasks ( ) ;
104- for ( i, task) in tasks. iter ( ) . enumerate ( ) {
105- let status = if task. completed { "[x]" } else { "[ ]" } ;
106- println ! ( "{} {} {} " , i+1 , status, task. desc) ;
107- }
108- }
0 commit comments