diff --git a/src/main.rs b/src/main.rs index 1574356..71e63e1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -30,7 +30,7 @@ fn main() { logger::configure(env::var_os(vars::EXA_DEBUG)); let args: Vec<_> = env::args_os().skip(1).collect(); - match Options::parse(&args, &LiveVars) { + match Options::parse(args.iter().map(|e| e.as_ref()), &LiveVars) { OptionsResult::Ok(options, mut input_paths) => { // List the current directory by default. diff --git a/src/options/help.rs b/src/options/help.rs index 5cc2f63..f7c8d08 100644 --- a/src/options/help.rs +++ b/src/options/help.rs @@ -130,32 +130,26 @@ impl fmt::Display for HelpString { #[cfg(test)] mod test { use crate::options::{Options, OptionsResult}; - use std::ffi::OsString; - - fn os(input: &'static str) -> OsString { - let mut os = OsString::new(); - os.push(input); - os - } + use std::ffi::OsStr; #[test] fn help() { - let args = [ os("--help") ]; - let opts = Options::parse(&args, &None); + let args = vec![ OsStr::new("--help") ]; + let opts = Options::parse(args, &None); assert!(matches!(opts, OptionsResult::Help(_))); } #[test] fn help_with_file() { - let args = [ os("--help"), os("me") ]; - let opts = Options::parse(&args, &None); + let args = vec![ OsStr::new("--help"), OsStr::new("me") ]; + let opts = Options::parse(args, &None); assert!(matches!(opts, OptionsResult::Help(_))); } #[test] fn unhelpful() { - let args = []; - let opts = Options::parse(&args, &None); + let args = vec![]; + let opts = Options::parse(args, &None); assert!(! matches!(opts, OptionsResult::Help(_))) // no help when --help isn’t passed } } diff --git a/src/options/mod.rs b/src/options/mod.rs index 29a3a8f..cdfdd19 100644 --- a/src/options/mod.rs +++ b/src/options/mod.rs @@ -69,7 +69,7 @@ //! it’s clear what the user wants. -use std::ffi::{OsStr, OsString}; +use std::ffi::OsStr; use crate::fs::dir_action::DirAction; use crate::fs::filter::{FileFilter, GitIgnore}; @@ -120,7 +120,7 @@ impl Options { /// for extra options. #[allow(unused_results)] pub fn parse<'args, I, V>(args: I, vars: &V) -> OptionsResult<'args> - where I: IntoIterator, + where I: IntoIterator, V: Vars, { use crate::options::parser::{Matches, Strictness}; @@ -198,7 +198,7 @@ pub enum OptionsResult<'args> { #[cfg(test)] pub mod test { use crate::options::parser::{Arg, MatchedFlags}; - use std::ffi::OsString; + use std::ffi::OsStr; #[derive(PartialEq, Debug)] pub enum Strictnesses { @@ -219,27 +219,19 @@ pub mod test { use self::Strictnesses::*; use crate::options::parser::{Args, Strictness}; - let bits = inputs.into_iter().map(|&o| os(o)).collect::>(); + let bits = inputs.into_iter().map(OsStr::new).collect::>(); let mut result = Vec::new(); if strictnesses == Last || strictnesses == Both { - let results = Args(args).parse(bits.iter(), Strictness::UseLastArguments); + let results = Args(args).parse(bits.clone(), Strictness::UseLastArguments); result.push(get(&results.unwrap().flags)); } if strictnesses == Complain || strictnesses == Both { - let results = Args(args).parse(bits.iter(), Strictness::ComplainAboutRedundantArguments); + let results = Args(args).parse(bits, Strictness::ComplainAboutRedundantArguments); result.push(get(&results.unwrap().flags)); } result } - - /// Creates an `OSStr` (used in tests) - #[cfg(test)] - fn os(input: &str) -> OsString { - let mut os = OsString::new(); - os.push(input); - os - } } diff --git a/src/options/parser.rs b/src/options/parser.rs index 26bf2f8..c5d6955 100644 --- a/src/options/parser.rs +++ b/src/options/parser.rs @@ -144,7 +144,7 @@ impl Args { /// Iterates over the given list of command-line arguments and parses /// them into a list of matched flags and free strings. pub fn parse<'args, I>(&self, inputs: I, strictness: Strictness) -> Result, ParseError> - where I: IntoIterator + where I: IntoIterator { use std::os::unix::ffi::OsStrExt; @@ -507,24 +507,16 @@ fn split_on_equals(input: &OsStr) -> Option<(&OsStr, &OsStr)> { } -/// Creates an `OSString` (used in tests) -#[cfg(test)] -fn os(input: &'static str) -> OsString { - let mut os = OsString::new(); - os.push(input); - os -} - - #[cfg(test)] mod split_test { - use super::{split_on_equals, os}; + use super::split_on_equals; + use std::ffi::{OsStr, OsString}; macro_rules! test_split { ($name:ident: $input:expr => None) => { #[test] fn $name() { - assert_eq!(split_on_equals(&os($input)), + assert_eq!(split_on_equals(&OsString::from($input)), None); } }; @@ -532,8 +524,8 @@ mod split_test { ($name:ident: $input:expr => $before:expr, $after:expr) => { #[test] fn $name() { - assert_eq!(split_on_equals(&os($input)), - Some((&*os($before), &*os($after)))); + assert_eq!(split_on_equals(&OsString::from($input)), + Some((OsStr::new($before), OsStr::new($after)))); } }; } @@ -555,29 +547,21 @@ mod split_test { mod parse_test { use super::*; - pub fn os(input: &'static str) -> OsString { - let mut os = OsString::new(); - os.push(input); - os - } - - macro_rules! test { ($name:ident: $inputs:expr => frees: $frees:expr, flags: $flags:expr) => { #[test] fn $name() { - // Annoyingly the input &strs need to be converted to OsStrings - let inputs: Vec = $inputs.as_ref().into_iter().map(|&o| os(o)).collect(); + let inputs: &[&'static str] = $inputs.as_ref(); + let inputs = inputs.iter().map(OsStr::new); - // Same with the frees - let frees: Vec = $frees.as_ref().into_iter().map(|&o| os(o)).collect(); - let frees: Vec<&OsStr> = frees.iter().map(|os| os.as_os_str()).collect(); + let frees: &[&'static str] = $frees.as_ref(); + let frees = frees.iter().map(OsStr::new).collect(); let flags = <[_]>::into_vec(Box::new($flags)); let strictness = Strictness::UseLastArguments; // this isn’t even used - let got = Args(TEST_ARGS).parse(inputs.iter(), strictness); + let got = Args(TEST_ARGS).parse(inputs, strictness); let flags = MatchedFlags { flags, strictness }; let expected = Ok(Matches { frees, flags }); @@ -590,12 +574,10 @@ mod parse_test { fn $name() { use self::ParseError::*; - let strictness = Strictness::UseLastArguments; // this isn’t even used - let bits = $inputs.as_ref().into_iter() - .map(|&o| os(o)) - .collect::>(); + let inputs = $inputs.iter().map(OsStr::new); - let got = Args(TEST_ARGS).parse(bits.iter(), strictness); + let strictness = Strictness::UseLastArguments; // this isn’t even used + let got = Args(TEST_ARGS).parse(inputs, strictness); assert_eq!(got, Err($error)); } }; @@ -663,8 +645,8 @@ mod parse_test { // Unknown args - test!(unknown_long: ["--quiet"] => error UnknownArgument { attempt: os("quiet") }); - test!(unknown_long_eq: ["--quiet=shhh"] => error UnknownArgument { attempt: os("quiet") }); + test!(unknown_long: ["--quiet"] => error UnknownArgument { attempt: OsString::from("quiet") }); + test!(unknown_long_eq: ["--quiet=shhh"] => error UnknownArgument { attempt: OsString::from("quiet") }); test!(unknown_short: ["-q"] => error UnknownShortArgument { attempt: b'q' }); test!(unknown_short_2nd: ["-lq"] => error UnknownShortArgument { attempt: b'q' }); test!(unknown_short_eq: ["-q=shhh"] => error UnknownShortArgument { attempt: b'q' }); @@ -704,7 +686,7 @@ mod matches_test { #[test] fn only_count() { - let everything = os("everything"); + let everything = OsString::from("everything"); let flags = MatchedFlags { flags: vec![ (Flag::Short(b'c'), Some(&*everything)) ], @@ -716,8 +698,8 @@ mod matches_test { #[test] fn rightmost_count() { - let everything = os("everything"); - let nothing = os("nothing"); + let everything = OsString::from("everything"); + let nothing = OsString::from("nothing"); let flags = MatchedFlags { flags: vec![ (Flag::Short(b'c'), Some(&*everything)), diff --git a/src/options/version.rs b/src/options/version.rs index e23eadc..eacf652 100644 --- a/src/options/version.rs +++ b/src/options/version.rs @@ -39,25 +39,19 @@ impl fmt::Display for VersionString { #[cfg(test)] mod test { use crate::options::{Options, OptionsResult}; - use std::ffi::OsString; - - fn os(input: &'static str) -> OsString { - let mut os = OsString::new(); - os.push(input); - os - } + use std::ffi::OsStr; #[test] fn version() { - let args = [ os("--version") ]; - let opts = Options::parse(&args, &None); + let args = vec![ OsStr::new("--version") ]; + let opts = Options::parse(args, &None); assert!(matches!(opts, OptionsResult::Version(_))); } #[test] fn version_with_file() { - let args = [ os("--version"), os("me") ]; - let opts = Options::parse(&args, &None); + let args = vec![ OsStr::new("--version"), OsStr::new("me") ]; + let opts = Options::parse(args, &None); assert!(matches!(opts, OptionsResult::Version(_))); } }