Skip to content

Commit e4d0f19

Browse files
bors[bot]lnicola
andauthored
Merge #5638
5638: Simplify argument parsing r=matklad a=lnicola and use `Display` when printing errors. Co-authored-by: Laurențiu Nicola <lnicola@dend.ro>
2 parents cf17366 + 562491b commit e4d0f19

File tree

2 files changed

+27
-24
lines changed

2 files changed

+27
-24
lines changed

crates/rust-analyzer/src/bin/args.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,16 @@ pub(crate) enum Command {
4444
ProcMacro,
4545
RunServer,
4646
Version,
47+
Help,
4748
}
4849

4950
impl Args {
50-
pub(crate) fn parse() -> Result<Result<Args, HelpPrinted>> {
51+
pub(crate) fn parse() -> Result<Args> {
5152
let mut matches = Arguments::from_env();
5253

5354
if matches.contains("--version") {
5455
matches.finish().or_else(handle_extra_flags)?;
55-
return Ok(Ok(Args { verbosity: Verbosity::Normal, command: Command::Version }));
56+
return Ok(Args { verbosity: Verbosity::Normal, command: Command::Version });
5657
}
5758

5859
let verbosity = match (
@@ -68,15 +69,16 @@ impl Args {
6869
(false, true, true) => bail!("Invalid flags: -q conflicts with -v"),
6970
};
7071

72+
let help = Ok(Args { verbosity, command: Command::Help });
7173
let subcommand = match matches.subcommand()? {
7274
Some(it) => it,
7375
None => {
7476
if matches.contains(["-h", "--help"]) {
7577
print_subcommands();
76-
return Ok(Err(HelpPrinted));
78+
return help;
7779
}
7880
matches.finish().or_else(handle_extra_flags)?;
79-
return Ok(Ok(Args { verbosity, command: Command::RunServer }));
81+
return Ok(Args { verbosity, command: Command::RunServer });
8082
}
8183
};
8284
let command = match subcommand.as_str() {
@@ -93,7 +95,7 @@ FLAGS:
9395
-h, --help Prints help information
9496
--no-dump"
9597
);
96-
return Ok(Err(HelpPrinted));
98+
return help;
9799
}
98100

99101
let no_dump = matches.contains("--no-dump");
@@ -112,7 +114,7 @@ USAGE:
112114
FLAGS:
113115
-h, --help Prints help inforamtion"
114116
);
115-
return Ok(Err(HelpPrinted));
117+
return help;
116118
}
117119

118120
matches.finish().or_else(handle_extra_flags)?;
@@ -132,7 +134,7 @@ FLAGS:
132134
-h, --help Prints help information
133135
-r, --rainbow"
134136
);
135-
return Ok(Err(HelpPrinted));
137+
return help;
136138
}
137139

138140
let rainbow = matches.contains(["-r", "--rainbow"]);
@@ -166,7 +168,7 @@ OPTIONS:
166168
ARGS:
167169
<PATH>"
168170
);
169-
return Ok(Err(HelpPrinted));
171+
return help;
170172
}
171173

172174
let randomize = matches.contains("--randomize");
@@ -220,7 +222,7 @@ OPTIONS:
220222
ARGS:
221223
<PATH> Project to analyse"
222224
);
223-
return Ok(Err(HelpPrinted));
225+
return help;
224226
}
225227

226228
let path: PathBuf = matches.opt_value_from_str("--project")?.unwrap_or_default();
@@ -266,7 +268,7 @@ FLAGS:
266268
ARGS:
267269
<PATH>"
268270
);
269-
return Ok(Err(HelpPrinted));
271+
return help;
270272
}
271273

272274
let load_output_dirs = matches.contains("--load-output-dirs");
@@ -302,7 +304,7 @@ FLAGS:
302304
ARGS:
303305
<RULE> A structured search replace rule"
304306
);
305-
return Ok(Err(HelpPrinted));
307+
return help;
306308
}
307309
let mut rules = Vec::new();
308310
while let Some(rule) = matches.free_from_str()? {
@@ -329,7 +331,7 @@ FLAGS:
329331
ARGS:
330332
<PATTERN> A structured search pattern"
331333
);
332-
return Ok(Err(HelpPrinted));
334+
return help;
333335
}
334336
let debug_snippet = matches.opt_value_from_str("--debug")?;
335337
let mut patterns = Vec::new();
@@ -340,10 +342,10 @@ ARGS:
340342
}
341343
_ => {
342344
print_subcommands();
343-
return Ok(Err(HelpPrinted));
345+
return help;
344346
}
345347
};
346-
Ok(Ok(Args { verbosity, command }))
348+
Ok(Args { verbosity, command })
347349
}
348350
}
349351

@@ -371,8 +373,6 @@ SUBCOMMANDS:
371373
)
372374
}
373375

374-
pub(crate) struct HelpPrinted;
375-
376376
fn handle_extra_flags(e: pico_args::Error) -> Result<()> {
377377
if let pico_args::Error::UnusedArgsLeft(flags) = e {
378378
let mut invalid_flags = String::new();

crates/rust-analyzer/src/bin/main.rs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
//! Based on cli flags, either spawns an LSP server, or runs a batch analysis
44
mod args;
55

6-
use std::convert::TryFrom;
6+
use std::{convert::TryFrom, process};
77

88
use lsp_server::Connection;
99
use ra_project_model::ProjectManifest;
@@ -14,18 +14,20 @@ use rust_analyzer::{
1414
};
1515
use vfs::AbsPathBuf;
1616

17-
use crate::args::HelpPrinted;
18-
1917
#[cfg(all(feature = "mimalloc"))]
2018
#[global_allocator]
2119
static ALLOC: mimalloc::MiMalloc = mimalloc::MiMalloc;
2220

23-
fn main() -> Result<()> {
21+
fn main() {
22+
if let Err(err) = try_main() {
23+
eprintln!("{}", err);
24+
process::exit(101);
25+
}
26+
}
27+
28+
fn try_main() -> Result<()> {
2429
setup_logging()?;
25-
let args = match args::Args::parse()? {
26-
Ok(it) => it,
27-
Err(HelpPrinted) => return Ok(()),
28-
};
30+
let args = args::Args::parse()?;
2931
match args.command {
3032
args::Command::RunServer => run_server()?,
3133
args::Command::ProcMacro => ra_proc_macro_srv::cli::run()?,
@@ -45,6 +47,7 @@ fn main() -> Result<()> {
4547
cli::search_for_patterns(patterns, debug_snippet)?;
4648
}
4749
args::Command::Version => println!("rust-analyzer {}", env!("REV")),
50+
args::Command::Help => {}
4851
}
4952
Ok(())
5053
}

0 commit comments

Comments
 (0)