Skip to content

Commit 4714ca3

Browse files
committed
Use clap to parse cli args
1 parent a09d1c7 commit 4714ca3

File tree

4 files changed

+174
-11
lines changed

4 files changed

+174
-11
lines changed

.dir-locals.el

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
;;; Directory Local Variables -*- no-byte-compile: t; -*-
22
;;; For more information see (info "(emacs) Directory Variables")
33

4-
((rust-mode . ((lsp-rust-analyzer-proc-macro-enable . nil))))
4+
((rust-mode . ((lsp-rust-analyzer-proc-macro-enable . t))))

Cargo.lock

Lines changed: 125 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ lazy_static = "1.4"
1313
smallvec = "1.11"
1414
env_logger = "0.10"
1515
log = "0.4.20"
16+
clap = { version = "4.4", features = ["derive", "cargo"] }
17+
clap-verbosity-flag = "2.1.1"
1618

1719
[[example]]
1820
name = "native-json-parser"

src/main.rs

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,42 @@
11
use anyhow::{Result, bail};
2+
use clap::Parser;
23

34
use 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

Comments
 (0)