From 735845d86e6ab94891e421823158f374e2f3412a Mon Sep 17 00:00:00 2001 From: Geobert Quach Date: Tue, 10 Sep 2019 11:31:40 +0100 Subject: refactor(args): Switch to pico-args --- crates/ra_cli/src/main.rs | 186 +++++++++++++++++++++++++++------------------- 1 file changed, 109 insertions(+), 77 deletions(-) (limited to 'crates/ra_cli/src/main.rs') diff --git a/crates/ra_cli/src/main.rs b/crates/ra_cli/src/main.rs index de8191ca3..9e6f869c1 100644 --- a/crates/ra_cli/src/main.rs +++ b/crates/ra_cli/src/main.rs @@ -1,10 +1,11 @@ mod analysis_stats; mod analysis_bench; +mod help; -use std::{error::Error, io::Read}; +use std::{error::Error, fmt::Write, io::Read}; -use clap::{App, Arg, SubCommand}; use flexi_logger::Logger; +use pico_args::Arguments; use ra_ide_api::{file_structure, Analysis}; use ra_prof::profile; use ra_syntax::{AstNode, SourceFile}; @@ -13,93 +14,124 @@ type Result = std::result::Result>; fn main() -> Result<()> { Logger::with_env().start()?; - let matches = App::new("ra-cli") - .setting(clap::AppSettings::SubcommandRequiredElseHelp) - .subcommand(SubCommand::with_name("parse").arg(Arg::with_name("no-dump").long("--no-dump"))) - .subcommand(SubCommand::with_name("symbols")) - .subcommand( - SubCommand::with_name("highlight") - .arg(Arg::with_name("rainbow").short("r").long("rainbow")), - ) - .subcommand( - SubCommand::with_name("analysis-stats") - .arg(Arg::with_name("verbose").short("v").long("verbose")) - .arg(Arg::with_name("memory-usage").long("memory-usage")) - .arg(Arg::with_name("only").short("o").takes_value(true)) - .arg(Arg::with_name("path")), - ) - .subcommand( - SubCommand::with_name("analysis-bench") - .arg(Arg::with_name("verbose").short("v").long("verbose")) - .arg( - Arg::with_name("highlight") - .long("highlight") - .takes_value(true) - .conflicts_with("complete") - .value_name("PATH") - .help("highlight this file"), - ) - .arg( - Arg::with_name("complete") - .long("complete") - .takes_value(true) - .conflicts_with("highlight") - .value_name("PATH:LINE:COLUMN") - .help("compute completions at this location"), - ) - .arg(Arg::with_name("path").value_name("PATH").help("project to analyze")), - ) - .get_matches(); - match matches.subcommand() { - ("parse", Some(matches)) => { - let _p = profile("parsing"); - let file = file()?; - if !matches.is_present("no-dump") { - println!("{:#?}", file.syntax()); + + let subcommand = std::env::args_os().nth(1); + if subcommand.is_none() { + help::print_global_help(); + return Ok(()); + } + let subcommand = subcommand.unwrap(); + let mut args: Vec<_> = std::env::args_os().collect(); + let mut matches = Arguments::from_vec(args.drain(2..).collect()); + + match &*subcommand.to_string_lossy() { + "parse" => { + if matches.contains(["-h", "--help"]) { + help::print_parse_help(); + return Ok(()); + } else { + let no_dump = matches.contains("--no-dump"); + matches.finish().or_else(handle_extra_flags)?; + + let _p = profile("parsing"); + let file = file()?; + if !no_dump { + println!("{:#?}", file.syntax()); + } + std::mem::forget(file); } - std::mem::forget(file); } - ("symbols", _) => { - let file = file()?; - for s in file_structure(&file) { - println!("{:?}", s); + "symbols" => { + if matches.contains(["-h", "--help"]) { + help::print_symbols_help(); + return Ok(()); + } else { + matches.finish().or_else(handle_extra_flags)?; + let file = file()?; + for s in file_structure(&file) { + println!("{:?}", s); + } } } - ("highlight", Some(matches)) => { - let (analysis, file_id) = Analysis::from_single_file(read_stdin()?); - let html = analysis.highlight_as_html(file_id, matches.is_present("rainbow")).unwrap(); - println!("{}", html); + "highlight" => { + if matches.contains(["-h", "--help"]) { + help::print_highlight_help(); + return Ok(()); + } else { + let rainbow_opt = matches.contains(["-r", "--rainbow"]); + matches.finish().or_else(handle_extra_flags)?; + let (analysis, file_id) = Analysis::from_single_file(read_stdin()?); + let html = analysis.highlight_as_html(file_id, rainbow_opt).unwrap(); + println!("{}", html); + } } - ("analysis-stats", Some(matches)) => { - let verbose = matches.is_present("verbose"); - let memory_usage = matches.is_present("memory-usage"); - let path = matches.value_of("path").unwrap_or(""); - let only = matches.value_of("only"); - analysis_stats::run(verbose, memory_usage, path.as_ref(), only)?; + "analysis-stats" => { + if matches.contains(["-h", "--help"]) { + help::print_analysis_stats_help(); + return Ok(()); + } else { + let verbose = matches.contains(["-v", "--verbose"]); + let memory_usage = matches.contains("--memory-usage"); + let path = matches.value_from_str("--path")?.unwrap_or("".to_string()); + let only = matches.value_from_str(["-o", "--only"])?.map(|v: String| v.to_owned()); + matches.finish().or_else(handle_extra_flags)?; + analysis_stats::run( + verbose, + memory_usage, + path.as_ref(), + only.as_ref().map(String::as_ref), + )?; + } } - ("analysis-bench", Some(matches)) => { - let verbose = matches.is_present("verbose"); - let path = matches.value_of("path").unwrap_or(""); - let op = if let Some(path) = matches.value_of("highlight") { - analysis_bench::Op::Highlight { path: path.into() } - } else if let Some(path_line_col) = matches.value_of("complete") { - let (path_line, column) = rsplit_at_char(path_line_col, ':')?; - let (path, line) = rsplit_at_char(path_line, ':')?; - analysis_bench::Op::Complete { - path: path.into(), - line: line.parse()?, - column: column.parse()?, - } + "analysis-bench" => { + if matches.contains(["-h", "--help"]) { + help::print_analysis_bench_help(); + return Ok(()); } else { - panic!("either --highlight or --complete must be set") - }; - analysis_bench::run(verbose, path.as_ref(), op)?; + let verbose = matches.contains(["-v", "--verbose"]); + let path = matches.value_from_str("--path")?.unwrap_or("".to_string()); + let highlight_path = matches.value_from_str("--highlight")?; + let complete_path = matches.value_from_str("--complete")?; + if highlight_path.is_some() && complete_path.is_some() { + panic!("either --highlight or --complete must be set, not both") + } + let op = if let Some(path) = highlight_path { + let path: String = path; + analysis_bench::Op::Highlight { path: path.into() } + } else if let Some(path_line_col) = complete_path { + let path_line_col: String = path_line_col; + let (path_line, column) = rsplit_at_char(path_line_col.as_str(), ':')?; + let (path, line) = rsplit_at_char(path_line, ':')?; + analysis_bench::Op::Complete { + path: path.into(), + line: line.parse()?, + column: column.parse()?, + } + } else { + panic!("either --highlight or --complete must be set") + }; + matches.finish().or_else(handle_extra_flags)?; + analysis_bench::run(verbose, path.as_ref(), op)?; + } } - _ => unreachable!(), + _ => help::print_global_help(), } Ok(()) } +fn handle_extra_flags(e: pico_args::Error) -> Result<()> { + if let pico_args::Error::UnusedArgsLeft(flags) = e { + let mut invalid_flags = String::new(); + for flag in flags { + write!(&mut invalid_flags, "{}, ", flag).expect("Error on write"); + } + let (invalid_flags, _) = invalid_flags.split_at(invalid_flags.len() - 2); + Err(format!("Invalid flags: {}", invalid_flags).into()) + } else { + Err(e.to_string().into()) + } +} + fn file() -> Result { let text = read_stdin()?; Ok(SourceFile::parse(&text).tree()) -- cgit v1.2.3 From 4e94c467131a7685b0a0a52b372aa0dd76abba36 Mon Sep 17 00:00:00 2001 From: Geobert Quach Date: Tue, 10 Sep 2019 12:56:45 +0100 Subject: refactor(args): Switch to pico-args in ra_tools --- crates/ra_cli/src/main.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'crates/ra_cli/src/main.rs') diff --git a/crates/ra_cli/src/main.rs b/crates/ra_cli/src/main.rs index 9e6f869c1..a9a9fbddd 100644 --- a/crates/ra_cli/src/main.rs +++ b/crates/ra_cli/src/main.rs @@ -21,8 +21,7 @@ fn main() -> Result<()> { return Ok(()); } let subcommand = subcommand.unwrap(); - let mut args: Vec<_> = std::env::args_os().collect(); - let mut matches = Arguments::from_vec(args.drain(2..).collect()); + let mut matches = Arguments::from_vec(std::env::args_os().skip(2).collect()); match &*subcommand.to_string_lossy() { "parse" => { -- cgit v1.2.3 From aa894ace1fc4600dbc94bccb05532154ee2288d8 Mon Sep 17 00:00:00 2001 From: Geobert Quach Date: Tue, 10 Sep 2019 16:17:11 +0100 Subject: refactor(args): Apply comments --- crates/ra_cli/src/main.rs | 138 ++++++++++++++++++++++------------------------ 1 file changed, 67 insertions(+), 71 deletions(-) (limited to 'crates/ra_cli/src/main.rs') diff --git a/crates/ra_cli/src/main.rs b/crates/ra_cli/src/main.rs index a9a9fbddd..e6334cf56 100644 --- a/crates/ra_cli/src/main.rs +++ b/crates/ra_cli/src/main.rs @@ -15,105 +15,101 @@ type Result = std::result::Result>; fn main() -> Result<()> { Logger::with_env().start()?; - let subcommand = std::env::args_os().nth(1); - if subcommand.is_none() { - help::print_global_help(); - return Ok(()); - } - let subcommand = subcommand.unwrap(); + let subcommand = match std::env::args_os().nth(1) { + None => { + eprintln!("{}", help::GLOBAL_HELP); + return Ok(()); + } + Some(s) => s, + }; let mut matches = Arguments::from_vec(std::env::args_os().skip(2).collect()); match &*subcommand.to_string_lossy() { "parse" => { if matches.contains(["-h", "--help"]) { - help::print_parse_help(); + eprintln!("{}", help::PARSE_HELP); return Ok(()); - } else { - let no_dump = matches.contains("--no-dump"); - matches.finish().or_else(handle_extra_flags)?; + } + let no_dump = matches.contains("--no-dump"); + matches.finish().or_else(handle_extra_flags)?; - let _p = profile("parsing"); - let file = file()?; - if !no_dump { - println!("{:#?}", file.syntax()); - } - std::mem::forget(file); + let _p = profile("parsing"); + let file = file()?; + if !no_dump { + println!("{:#?}", file.syntax()); } + std::mem::forget(file); } "symbols" => { if matches.contains(["-h", "--help"]) { - help::print_symbols_help(); + eprintln!("{}", help::SYMBOLS_HELP); return Ok(()); - } else { - matches.finish().or_else(handle_extra_flags)?; - let file = file()?; - for s in file_structure(&file) { - println!("{:?}", s); - } + } + matches.finish().or_else(handle_extra_flags)?; + let file = file()?; + for s in file_structure(&file) { + println!("{:?}", s); } } "highlight" => { if matches.contains(["-h", "--help"]) { - help::print_highlight_help(); + eprintln!("{}", help::HIGHLIGHT_HELP); return Ok(()); - } else { - let rainbow_opt = matches.contains(["-r", "--rainbow"]); - matches.finish().or_else(handle_extra_flags)?; - let (analysis, file_id) = Analysis::from_single_file(read_stdin()?); - let html = analysis.highlight_as_html(file_id, rainbow_opt).unwrap(); - println!("{}", html); } + let rainbow_opt = matches.contains(["-r", "--rainbow"]); + matches.finish().or_else(handle_extra_flags)?; + let (analysis, file_id) = Analysis::from_single_file(read_stdin()?); + let html = analysis.highlight_as_html(file_id, rainbow_opt).unwrap(); + println!("{}", html); } "analysis-stats" => { if matches.contains(["-h", "--help"]) { - help::print_analysis_stats_help(); + eprintln!("{}", help::ANALYSIS_STATS_HELP); return Ok(()); - } else { - let verbose = matches.contains(["-v", "--verbose"]); - let memory_usage = matches.contains("--memory-usage"); - let path = matches.value_from_str("--path")?.unwrap_or("".to_string()); - let only = matches.value_from_str(["-o", "--only"])?.map(|v: String| v.to_owned()); - matches.finish().or_else(handle_extra_flags)?; - analysis_stats::run( - verbose, - memory_usage, - path.as_ref(), - only.as_ref().map(String::as_ref), - )?; } + let verbose = matches.contains(["-v", "--verbose"]); + let memory_usage = matches.contains("--memory-usage"); + let path: String = matches.value_from_str("--path")?.unwrap_or_default(); + let only = matches.value_from_str(["-o", "--only"])?.map(|v: String| v.to_owned()); + matches.finish().or_else(handle_extra_flags)?; + analysis_stats::run( + verbose, + memory_usage, + path.as_ref(), + only.as_ref().map(String::as_ref), + )?; } "analysis-bench" => { if matches.contains(["-h", "--help"]) { - help::print_analysis_bench_help(); + eprintln!("{}", help::ANALYSIS_BENCH_HELP); return Ok(()); - } else { - let verbose = matches.contains(["-v", "--verbose"]); - let path = matches.value_from_str("--path")?.unwrap_or("".to_string()); - let highlight_path = matches.value_from_str("--highlight")?; - let complete_path = matches.value_from_str("--complete")?; - if highlight_path.is_some() && complete_path.is_some() { - panic!("either --highlight or --complete must be set, not both") - } - let op = if let Some(path) = highlight_path { - let path: String = path; - analysis_bench::Op::Highlight { path: path.into() } - } else if let Some(path_line_col) = complete_path { - let path_line_col: String = path_line_col; - let (path_line, column) = rsplit_at_char(path_line_col.as_str(), ':')?; - let (path, line) = rsplit_at_char(path_line, ':')?; - analysis_bench::Op::Complete { - path: path.into(), - line: line.parse()?, - column: column.parse()?, - } - } else { - panic!("either --highlight or --complete must be set") - }; - matches.finish().or_else(handle_extra_flags)?; - analysis_bench::run(verbose, path.as_ref(), op)?; } + let verbose = matches.contains(["-v", "--verbose"]); + let path: String = matches.value_from_str("--path")?.unwrap_or_default(); + let highlight_path = matches.value_from_str("--highlight")?; + let complete_path = matches.value_from_str("--complete")?; + if highlight_path.is_some() && complete_path.is_some() { + panic!("either --highlight or --complete must be set, not both") + } + let op = if let Some(path) = highlight_path { + let path: String = path; + analysis_bench::Op::Highlight { path: path.into() } + } else if let Some(path_line_col) = complete_path { + let path_line_col: String = path_line_col; + let (path_line, column) = rsplit_at_char(path_line_col.as_str(), ':')?; + let (path, line) = rsplit_at_char(path_line, ':')?; + analysis_bench::Op::Complete { + path: path.into(), + line: line.parse()?, + column: column.parse()?, + } + } else { + panic!("either --highlight or --complete must be set") + }; + matches.finish().or_else(handle_extra_flags)?; + analysis_bench::run(verbose, path.as_ref(), op)?; } - _ => help::print_global_help(), + _ => eprintln!("{}", help::GLOBAL_HELP), } Ok(()) } @@ -122,7 +118,7 @@ fn handle_extra_flags(e: pico_args::Error) -> Result<()> { if let pico_args::Error::UnusedArgsLeft(flags) = e { let mut invalid_flags = String::new(); for flag in flags { - write!(&mut invalid_flags, "{}, ", flag).expect("Error on write"); + write!(&mut invalid_flags, "{}, ", flag)?; } let (invalid_flags, _) = invalid_flags.split_at(invalid_flags.len() - 2); Err(format!("Invalid flags: {}", invalid_flags).into()) -- cgit v1.2.3