11use anyhow:: { Result , bail} ;
2+ use clap:: Parser ;
23
34use emacs_lsp_booster:: app;
45
56
6- fn main ( ) -> Result < ( ) > {
7- let args = std:: env:: args ( ) . collect :: < Vec < _ > > ( ) ;
8- if args. len ( ) < 2 {
9- bail ! ( "Usage: {} LSP_SERVER_CMD ARGS..." , args[ 0 ] ) ;
7+ #[ derive( Parser , Default ) ]
8+ #[ command( long_about = None , about = None ,
9+ arg_required_else_help = true , after_help = "For backward compatibility, `emacs-lsp-booster <SERVER_CMD>...` (without any options) is also supported\n " ) ]
10+ struct Cli {
11+ #[ command( flatten) ]
12+ verbose : clap_verbosity_flag:: Verbosity ,
13+
14+ #[ arg( last = true ) ]
15+ server_cmd : Vec < String > ,
16+ }
17+
18+ fn parse_args < T , S > ( args : T ) -> Cli
19+ where T : IntoIterator < Item =S > ,
20+ S : Into < String > {
21+ let args = args. into_iter ( ) . map ( |x| x. into ( ) ) . collect :: < Vec < String > > ( ) ;
22+ // backward compatible. support `emacs-lsp-booster server_cmd args...` directly
23+ if args. len ( ) > 1 && !args[ 1 ] . starts_with ( '-' ) && !args. contains ( & "--" . into ( ) ) {
24+ Cli {
25+ server_cmd : args[ 1 ..] . to_vec ( ) ,
26+ ..Default :: default ( )
27+ }
28+ } else {
29+ Cli :: parse_from ( args)
1030 }
31+ }
1132
12- if std:: env:: var ( "RUST_LOG" ) . is_err ( ) {
13- std:: env:: set_var ( "RUST_LOG" , "info" ) ;
33+ fn main ( ) -> Result < ( ) > {
34+ let cli = parse_args ( std:: env:: args ( ) ) ;
35+ env_logger:: Builder :: new ( ) . filter_level ( cli. verbose . log_level_filter ( ) ) . init ( ) ;
36+
37+ if cli. server_cmd . is_empty ( ) {
38+ bail ! ( "Please specify the server command" ) ;
1439 }
15- env_logger:: init ( ) ;
1640
1741 // exit the process if any thread panic
1842 let original_panic_hook = std:: panic:: take_hook ( ) ;
@@ -21,9 +45,22 @@ fn main() -> Result<()> {
2145 std:: process:: exit ( 1 ) ;
2246 } ) ) ;
2347
24- let mut cmd = std:: process:: Command :: new ( & args [ 1 ] ) ;
25- cmd. args ( & args [ 2 ..] ) ;
48+ let mut cmd = std:: process:: Command :: new ( & cli . server_cmd [ 0 ] ) ;
49+ cmd. args ( & cli . server_cmd [ 1 ..] ) ;
2650
2751 let exit_status = app:: run_app_forever ( std:: io:: stdin ( ) , std:: io:: stdout ( ) , cmd) ?;
2852 std:: process:: exit ( exit_status. code ( ) . unwrap_or ( 1 ) )
2953}
54+
55+ #[ test]
56+ fn test_parse_args ( ) {
57+ let cli = parse_args ( vec ! [ "emacs-lsp-booster" , "server_cmd" , "arg1" ] ) ;
58+ assert_eq ! ( cli. server_cmd, vec![ "server_cmd" , "arg1" ] ) ;
59+
60+ let cli = parse_args ( vec ! [ "emacs-lsp-booster" , "--" , "server_cmd" , "arg1" ] ) ;
61+ assert_eq ! ( cli. server_cmd, vec![ "server_cmd" , "arg1" ] ) ;
62+
63+ let cli = parse_args ( vec ! [ "emacs-lsp-booster" , "-v" , "--" , "server_cmd" , "arg1" ] ) ;
64+ assert_eq ! ( cli. verbose. log_level_filter( ) , log:: LevelFilter :: Warn ) ;
65+ assert_eq ! ( cli. server_cmd, vec![ "server_cmd" , "arg1" ] ) ;
66+ }
0 commit comments