11//! Clap Commanders
22use crate :: {
3- cmds:: {
4- completion_handler, Command , CompletionCommand , DataCommand , EditCommand , ExecCommand ,
5- ListCommand , PickCommand , StatCommand , TestCommand ,
6- } ,
3+ cmd:: { CompletionsArgs , DataArgs , EditArgs , ExecArgs , ListArgs , PickArgs , StatArgs , TestArgs } ,
74 err:: Error ,
8- flag:: { Debug , Flag } ,
95} ;
10- use clap:: crate_version;
6+ use clap:: { CommandFactory , Parser , Subcommand } ;
7+ use env_logger:: Env ;
118use log:: LevelFilter ;
129
1310/// This should be called before calling any cli method or printing any output.
@@ -23,46 +20,81 @@ pub fn reset_signal_pipe_handler() {
2320 }
2421}
2522
23+ /// May the Code be with You
24+ #[ derive( Parser ) ]
25+ #[ command( name = "leetcode" , version, about = "May the Code be with You 👻" ) ]
26+ #[ command( arg_required_else_help = true ) ]
27+ pub struct Cli {
28+ /// Debug mode
29+ #[ arg( short, long) ]
30+ pub debug : bool ,
31+
32+ #[ command( subcommand) ]
33+ pub command : Option < Commands > ,
34+ }
35+
36+ #[ derive( Subcommand ) ]
37+ pub enum Commands {
38+ /// Manage Cache
39+ #[ command( visible_alias = "d" , display_order = 1 ) ]
40+ Data ( DataArgs ) ,
41+
42+ /// Edit question
43+ #[ command( visible_alias = "e" , display_order = 2 ) ]
44+ Edit ( EditArgs ) ,
45+
46+ /// Submit solution
47+ #[ command( visible_alias = "x" , display_order = 3 ) ]
48+ Exec ( ExecArgs ) ,
49+
50+ /// List problems
51+ #[ command( visible_alias = "l" , display_order = 4 ) ]
52+ List ( ListArgs ) ,
53+
54+ /// Pick a problem
55+ #[ command( visible_alias = "p" , display_order = 5 ) ]
56+ Pick ( PickArgs ) ,
57+
58+ /// Show simple chart about submissions
59+ #[ command( visible_alias = "s" , display_order = 6 ) ]
60+ Stat ( StatArgs ) ,
61+
62+ /// Test a question
63+ #[ command( visible_alias = "t" , display_order = 7 ) ]
64+ Test ( TestArgs ) ,
65+
66+ /// Generate shell Completions
67+ #[ command( visible_alias = "c" , display_order = 8 ) ]
68+ Completions ( CompletionsArgs ) ,
69+ }
70+
2671/// Get matches
2772pub async fn main ( ) -> Result < ( ) , Error > {
2873 reset_signal_pipe_handler ( ) ;
2974
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 ( ) ?;
75+ let cli = Cli :: parse ( ) ;
76+
77+ if cli. debug {
78+ env_logger:: Builder :: from_env ( Env :: default ( ) . default_filter_or ( "debug" ) ) . init ( ) ;
5079 } else {
5180 env_logger:: Builder :: new ( )
5281 . filter_level ( LevelFilter :: Info )
5382 . format_timestamp ( None )
5483 . init ( ) ;
5584 }
5685
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 ) ,
86+ match cli. command {
87+ Some ( Commands :: Data ( args) ) => args. run ( ) . await ,
88+ Some ( Commands :: Edit ( args) ) => args. run ( ) . await ,
89+ Some ( Commands :: Exec ( args) ) => args. run ( ) . await ,
90+ Some ( Commands :: List ( args) ) => args. run ( ) . await ,
91+ Some ( Commands :: Pick ( args) ) => args. run ( ) . await ,
92+ Some ( Commands :: Stat ( args) ) => args. run ( ) . await ,
93+ Some ( Commands :: Test ( args) ) => args. run ( ) . await ,
94+ Some ( Commands :: Completions ( args) ) => {
95+ let mut cmd = Cli :: command ( ) ;
96+ args. run ( & mut cmd)
97+ }
98+ None => Err ( Error :: MatchError ) ,
6799 }
68100}
0 commit comments