From da7d1adbeed875f912f046105d0bf5e8f63c7441 Mon Sep 17 00:00:00 2001 From: "Sergey \"Shnatsel\" Davidoff" Date: Fri, 25 Feb 2022 03:13:37 +0100 Subject: [PATCH] Fix separator handling in argument parsing (#11) * Make argument parsing correctly handle = as a separator. Hopefully. Fixes #9 * Add basic tests for '=' separator * Fix '=' separator handling --- src/subcommand.rs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/subcommand.rs b/src/subcommand.rs index e76faee..514ea92 100644 --- a/src/subcommand.rs +++ b/src/subcommand.rs @@ -43,8 +43,11 @@ impl Subcommand { let mut examples = false; let mut bins = false; let mut quiet = false; - while let Some(name) = args.next() { - let value = if let Some(value) = args.peek() { + while let Some(mut name) = args.next() { + let value = if let Some(position) = name.as_str().find('=') { + name.remove(position); // drop the '=' sign so we can cleanly split the string in two + Some(name.split_off(position)) + } else if let Some(value) = args.peek() { if !value.starts_with("-") { args.next() } else { @@ -185,3 +188,22 @@ impl Subcommand { self.quiet } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_separator_space() { + let args = ["cargo", "subcommand", "build", "--target", "x86_64-unknown-linux-gnu"].iter().map(|s| s.to_string()); + let cmd = Subcommand::new(args, "subcommand", |_, _| Ok(false)).unwrap(); + assert_eq!(cmd.target(), Some("x86_64-unknown-linux-gnu")); + } + + #[test] + fn test_separator_equals() { + let args = ["cargo", "subcommand", "build", "--target=x86_64-unknown-linux-gnu"].iter().map(|s| s.to_string()); + let cmd = Subcommand::new(args, "subcommand", |_, _| Ok(false)).unwrap(); + assert_eq!(cmd.target(), Some("x86_64-unknown-linux-gnu")); + } +} \ No newline at end of file