11//! Clap Commanders
22use crate :: {
33 cmd:: {
4- completion_handler, Command , CompletionCommand , DataCommand , EditCommand , ExecCommand ,
5- ListCommand , PickCommand , StatCommand , TestCommand ,
4+ CompletionsArgs , DataArgs , EditArgs , ExecArgs , ListArgs , PickArgs , StatArgs , TestArgs ,
65 } ,
76 err:: Error ,
8- flag:: { Debug , Flag } ,
97} ;
10- use clap:: crate_version;
8+ use clap:: { CommandFactory , Parser , Subcommand } ;
9+ use env_logger:: Env ;
1110use log:: LevelFilter ;
1211
1312/// This should be called before calling any cli method or printing any output.
@@ -23,46 +22,81 @@ pub fn reset_signal_pipe_handler() {
2322 }
2423}
2524
25+ /// May the Code be with You
26+ #[ derive( Parser ) ]
27+ #[ command( name = "leetcode" , version, about = "May the Code be with You 👻" ) ]
28+ #[ command( arg_required_else_help = true ) ]
29+ pub struct Cli {
30+ /// Debug mode
31+ #[ arg( short, long) ]
32+ pub debug : bool ,
33+
34+ #[ command( subcommand) ]
35+ pub command : Option < Commands > ,
36+ }
37+
38+ #[ derive( Subcommand ) ]
39+ pub enum Commands {
40+ /// Manage Cache
41+ #[ command( visible_alias = "d" , display_order = 1 ) ]
42+ Data ( DataArgs ) ,
43+
44+ /// Edit question
45+ #[ command( visible_alias = "e" , display_order = 2 ) ]
46+ Edit ( EditArgs ) ,
47+
48+ /// Submit solution
49+ #[ command( visible_alias = "x" , display_order = 3 ) ]
50+ Exec ( ExecArgs ) ,
51+
52+ /// List problems
53+ #[ command( visible_alias = "l" , display_order = 4 ) ]
54+ List ( ListArgs ) ,
55+
56+ /// Pick a problem
57+ #[ command( visible_alias = "p" , display_order = 5 ) ]
58+ Pick ( PickArgs ) ,
59+
60+ /// Show simple chart about submissions
61+ #[ command( visible_alias = "s" , display_order = 6 ) ]
62+ Stat ( StatArgs ) ,
63+
64+ /// Test a question
65+ #[ command( visible_alias = "t" , display_order = 7 ) ]
66+ Test ( TestArgs ) ,
67+
68+ /// Generate shell Completions
69+ #[ command( visible_alias = "c" , display_order = 8 ) ]
70+ Completions ( CompletionsArgs ) ,
71+ }
72+
2673/// Get matches
2774pub async fn main ( ) -> Result < ( ) , Error > {
2875 reset_signal_pipe_handler ( ) ;
2976
30- let mut cmd = clap:: Command :: new ( "leetcode" )
31- . version ( crate_version ! ( ) )
32- . about ( "May the Code be with You 👻" )
33- . subcommands ( vec ! [
34- DataCommand :: usage( ) . display_order( 1 ) ,
35- EditCommand :: usage( ) . display_order( 2 ) ,
36- ExecCommand :: usage( ) . display_order( 3 ) ,
37- ListCommand :: usage( ) . display_order( 4 ) ,
38- PickCommand :: usage( ) . display_order( 5 ) ,
39- StatCommand :: usage( ) . display_order( 6 ) ,
40- TestCommand :: usage( ) . display_order( 7 ) ,
41- CompletionCommand :: usage( ) . display_order( 8 ) ,
42- ] )
43- . arg ( Debug :: usage ( ) )
44- . arg_required_else_help ( true ) ;
45-
46- let m = cmd. clone ( ) . get_matches ( ) ;
47-
48- if m. get_flag ( "debug" ) {
49- Debug :: handler ( ) ?;
77+ let cli = Cli :: parse ( ) ;
78+
79+ if cli. debug {
80+ env_logger:: Builder :: from_env ( Env :: default ( ) . default_filter_or ( "debug" ) ) . init ( ) ;
5081 } else {
5182 env_logger:: Builder :: new ( )
5283 . filter_level ( LevelFilter :: Info )
5384 . format_timestamp ( None )
5485 . init ( ) ;
5586 }
5687
57- match m. subcommand ( ) {
58- Some ( ( "data" , sub_m) ) => Ok ( DataCommand :: handler ( sub_m) . await ?) ,
59- Some ( ( "edit" , sub_m) ) => Ok ( EditCommand :: handler ( sub_m) . await ?) ,
60- Some ( ( "exec" , sub_m) ) => Ok ( ExecCommand :: handler ( sub_m) . await ?) ,
61- Some ( ( "list" , sub_m) ) => Ok ( ListCommand :: handler ( sub_m) . await ?) ,
62- Some ( ( "pick" , sub_m) ) => Ok ( PickCommand :: handler ( sub_m) . await ?) ,
63- Some ( ( "stat" , sub_m) ) => Ok ( StatCommand :: handler ( sub_m) . await ?) ,
64- Some ( ( "test" , sub_m) ) => Ok ( TestCommand :: handler ( sub_m) . await ?) ,
65- Some ( ( "completions" , sub_m) ) => Ok ( completion_handler ( sub_m, & mut cmd) ?) ,
66- _ => Err ( Error :: MatchError ) ,
88+ match cli. command {
89+ Some ( Commands :: Data ( args) ) => args. run ( ) . await ,
90+ Some ( Commands :: Edit ( args) ) => args. run ( ) . await ,
91+ Some ( Commands :: Exec ( args) ) => args. run ( ) . await ,
92+ Some ( Commands :: List ( args) ) => args. run ( ) . await ,
93+ Some ( Commands :: Pick ( args) ) => args. run ( ) . await ,
94+ Some ( Commands :: Stat ( args) ) => args. run ( ) . await ,
95+ Some ( Commands :: Test ( args) ) => args. run ( ) . await ,
96+ Some ( Commands :: Completions ( args) ) => {
97+ let mut cmd = Cli :: command ( ) ;
98+ args. run ( & mut cmd)
99+ }
100+ None => Err ( Error :: MatchError ) ,
67101 }
68102}
0 commit comments