ProcMacro,
RunServer,
Version,
+ Help,
}
impl Args {
- pub(crate) fn parse() -> Result<Result<Args, HelpPrinted>> {
+ pub(crate) fn parse() -> Result<Args> {
let mut matches = Arguments::from_env();
if matches.contains("--version") {
matches.finish().or_else(handle_extra_flags)?;
- return Ok(Ok(Args { verbosity: Verbosity::Normal, command: Command::Version }));
+ return Ok(Args { verbosity: Verbosity::Normal, command: Command::Version });
}
let verbosity = match (
(false, true, true) => bail!("Invalid flags: -q conflicts with -v"),
};
+ let help = Ok(Args { verbosity, command: Command::Help });
let subcommand = match matches.subcommand()? {
Some(it) => it,
None => {
if matches.contains(["-h", "--help"]) {
print_subcommands();
- return Ok(Err(HelpPrinted));
+ return help;
}
matches.finish().or_else(handle_extra_flags)?;
- return Ok(Ok(Args { verbosity, command: Command::RunServer }));
+ return Ok(Args { verbosity, command: Command::RunServer });
}
};
let command = match subcommand.as_str() {
-h, --help Prints help information
--no-dump"
);
- return Ok(Err(HelpPrinted));
+ return help;
}
let no_dump = matches.contains("--no-dump");
FLAGS:
-h, --help Prints help inforamtion"
);
- return Ok(Err(HelpPrinted));
+ return help;
}
matches.finish().or_else(handle_extra_flags)?;
-h, --help Prints help information
-r, --rainbow"
);
- return Ok(Err(HelpPrinted));
+ return help;
}
let rainbow = matches.contains(["-r", "--rainbow"]);
ARGS:
<PATH>"
);
- return Ok(Err(HelpPrinted));
+ return help;
}
let randomize = matches.contains("--randomize");
ARGS:
<PATH> Project to analyse"
);
- return Ok(Err(HelpPrinted));
+ return help;
}
let path: PathBuf = matches.opt_value_from_str("--project")?.unwrap_or_default();
ARGS:
<PATH>"
);
- return Ok(Err(HelpPrinted));
+ return help;
}
let load_output_dirs = matches.contains("--load-output-dirs");
ARGS:
<RULE> A structured search replace rule"
);
- return Ok(Err(HelpPrinted));
+ return help;
}
let mut rules = Vec::new();
while let Some(rule) = matches.free_from_str()? {
ARGS:
<PATTERN> A structured search pattern"
);
- return Ok(Err(HelpPrinted));
+ return help;
}
let debug_snippet = matches.opt_value_from_str("--debug")?;
let mut patterns = Vec::new();
}
_ => {
print_subcommands();
- return Ok(Err(HelpPrinted));
+ return help;
}
};
- Ok(Ok(Args { verbosity, command }))
+ Ok(Args { verbosity, command })
}
}
)
}
-pub(crate) struct HelpPrinted;
-
fn handle_extra_flags(e: pico_args::Error) -> Result<()> {
if let pico_args::Error::UnusedArgsLeft(flags) = e {
let mut invalid_flags = String::new();
//! Based on cli flags, either spawns an LSP server, or runs a batch analysis
mod args;
-use std::convert::TryFrom;
+use std::{convert::TryFrom, process};
use lsp_server::Connection;
use ra_project_model::ProjectManifest;
};
use vfs::AbsPathBuf;
-use crate::args::HelpPrinted;
-
#[cfg(all(feature = "mimalloc"))]
#[global_allocator]
static ALLOC: mimalloc::MiMalloc = mimalloc::MiMalloc;
-fn main() -> Result<()> {
+fn main() {
+ if let Err(err) = try_main() {
+ eprintln!("{}", err);
+ process::exit(101);
+ }
+}
+
+fn try_main() -> Result<()> {
setup_logging()?;
- let args = match args::Args::parse()? {
- Ok(it) => it,
- Err(HelpPrinted) => return Ok(()),
- };
+ let args = args::Args::parse()?;
match args.command {
args::Command::RunServer => run_server()?,
args::Command::ProcMacro => ra_proc_macro_srv::cli::run()?,
cli::search_for_patterns(patterns, debug_snippet)?;
}
args::Command::Version => println!("rust-analyzer {}", env!("REV")),
+ args::Command::Help => {}
}
Ok(())
}