From 7202953e69c6621a24c1609c5345b584dcd7530e Mon Sep 17 00:00:00 2001 From: Corey Powell Date: Wed, 2 Jun 2021 12:33:28 -0500 Subject: Dropped pico-args in favour of a simpler hand roller parser Not the greatest looking, but it gets the job done --- helix-term/src/main.rs | 70 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 58 insertions(+), 12 deletions(-) (limited to 'helix-term/src/main.rs') diff --git a/helix-term/src/main.rs b/helix-term/src/main.rs index da03569d..432f2a20 100644 --- a/helix-term/src/main.rs +++ b/helix-term/src/main.rs @@ -12,7 +12,7 @@ use helix_core::config_dir; use std::path::PathBuf; -use anyhow::{Context, Result}; +use anyhow::{Context, Error, Result}; fn setup_logging(verbosity: u64) -> Result<()> { let mut base_config = fern::Dispatch::new(); @@ -48,9 +48,53 @@ fn setup_logging(verbosity: u64) -> Result<()> { } pub struct Args { + display_help: bool, + display_version: bool, + verbosity: u64, files: Vec, } +fn parse_args(mut args: Args) -> Result { + let argv: Vec = std::env::args().collect(); + let mut iter = argv.iter(); + + iter.next(); // skip the program, we don't care about that + + loop { + match iter.next() { + Some(arg) if arg == "--" => break, // stop parsing at this point treat the remaining as files + Some(arg) if arg == "--version" => args.display_version = true, + Some(arg) if arg == "--help" => args.display_help = true, + Some(arg) if arg.starts_with("--") => { + return Err(Error::msg(format!( + "unexpected double dash argument: {}", + arg + ))) + } + Some(arg) if arg.starts_with('-') => { + let arg = arg.as_str().get(1..).unwrap().chars(); + for chr in arg { + match chr { + 'v' => args.verbosity += 1, + 'V' => args.display_version = true, + 'h' => args.display_help = true, + _ => return Err(Error::msg(format!("unexpected short arg {}", chr))), + } + } + } + Some(arg) => args.files.push(PathBuf::from(arg)), + None => break, // No more arguments to reduce + } + } + + // push the remaining args, if any to the files + for filename in iter { + args.files.push(PathBuf::from(filename)); + } + + Ok(args) +} + #[tokio::main] async fn main() -> Result<()> { let help = format!( @@ -76,18 +120,24 @@ FLAGS: env!("CARGO_PKG_DESCRIPTION"), ); - let mut pargs = pico_args::Arguments::from_env(); + let mut args: Args = Args { + display_help: false, + display_version: false, + verbosity: 0, + files: [].to_vec(), + }; + + args = parse_args(args).context("could not parse arguments")?; // Help has a higher priority and should be handled separately. - if pargs.contains(["-h", "--help"]) { + if args.display_help { print!("{}", help); std::process::exit(0); } - let mut verbosity: u64 = 0; - - if pargs.contains("-v") { - verbosity = 1; + if args.display_version { + println!("{} {}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION")); + std::process::exit(0); } let conf_dir = config_dir(); @@ -96,11 +146,7 @@ FLAGS: std::fs::create_dir(&conf_dir); } - setup_logging(verbosity).context("failed to initialize logging")?; - - let args = Args { - files: pargs.finish().into_iter().map(|arg| arg.into()).collect(), - }; + setup_logging(args.verbosity).context("failed to initialize logging")?; // initialize language registry use helix_core::syntax::{Loader, LOADER}; -- cgit v1.2.3-70-g09d2 From f0018280cbd6427d8102ccae7ec8c48ac046f922 Mon Sep 17 00:00:00 2001 From: Corey Powell Date: Wed, 2 Jun 2021 14:24:08 -0500 Subject: Refactored parse_args loop Thanks @PabloMansanet --- helix-term/src/main.rs | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) (limited to 'helix-term/src/main.rs') diff --git a/helix-term/src/main.rs b/helix-term/src/main.rs index 432f2a20..8f29007c 100644 --- a/helix-term/src/main.rs +++ b/helix-term/src/main.rs @@ -60,19 +60,19 @@ fn parse_args(mut args: Args) -> Result { iter.next(); // skip the program, we don't care about that - loop { - match iter.next() { - Some(arg) if arg == "--" => break, // stop parsing at this point treat the remaining as files - Some(arg) if arg == "--version" => args.display_version = true, - Some(arg) if arg == "--help" => args.display_help = true, - Some(arg) if arg.starts_with("--") => { + while let Some(arg) = iter.next() { + match arg.as_str() { + "--" => break, // stop parsing at this point treat the remaining as files + "--version" => args.display_version = true, + "--help" => args.display_help = true, + arg if arg.starts_with("--") => { return Err(Error::msg(format!( "unexpected double dash argument: {}", arg ))) } - Some(arg) if arg.starts_with('-') => { - let arg = arg.as_str().get(1..).unwrap().chars(); + arg if arg.starts_with('-') => { + let arg = arg.get(1..).unwrap().chars(); for chr in arg { match chr { 'v' => args.verbosity += 1, @@ -82,8 +82,7 @@ fn parse_args(mut args: Args) -> Result { } } } - Some(arg) => args.files.push(PathBuf::from(arg)), - None => break, // No more arguments to reduce + arg => args.files.push(PathBuf::from(arg)), } } -- cgit v1.2.3-70-g09d2