diff --git a/src/args/arg.rs b/src/args/arg.rs index 860477c6a84..c3cb531eac8 100644 --- a/src/args/arg.rs +++ b/src/args/arg.rs @@ -3062,9 +3062,17 @@ impl<'a, 'b> Arg<'a, 'b> { /// [`Arg::takes_value(true)`]: ./struct.Arg.html#method.takes_value /// [`ArgMatches::is_present`]: ./struct.ArgMatches.html#method.is_present /// [`Arg::default_value_if`]: ./struct.Arg.html#method.default_value_if - pub fn default_value(mut self, val: &'a str) -> Self { + pub fn default_value(self, val: &'a str) -> Self { + self.default_value_os(OsStr::from_bytes(val.as_bytes())) + } + + /// Provides a default value in the exact same manner as [`Arg::default_value`] + /// only using [`OsStr`]s instead. + /// [`Arg::default_value`]: ./struct.Arg.html#method.default_value + /// [`OsStr`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html + pub fn default_value_os(mut self, val: &'a OsStr) -> Self { self.setb(ArgSettings::TakesValue); - self.v.default_val = Some(OsStr::from_bytes(val.as_bytes())); + self.v.default_val = Some(val); self } diff --git a/tests/default_vals.rs b/tests/default_vals.rs index 17cbf443d5d..1040b0b7ca4 100644 --- a/tests/default_vals.rs +++ b/tests/default_vals.rs @@ -53,6 +53,68 @@ fn positional_user_override() { assert_eq!(m.value_of("arg").unwrap(), "value"); } +// OsStr Default Values + +#[test] +fn osstr_opts() { + use std::ffi::OsStr; + let expected = OsStr::new("default"); + + let r = App::new("df") + .arg( Arg::from_usage("-o [opt] 'some opt'") + .default_value_os(expected)) + .get_matches_from_safe(vec![""]); + assert!(r.is_ok()); + let m = r.unwrap(); + assert!(m.is_present("o")); + assert_eq!(m.value_of("o").unwrap(), expected); +} + +#[test] +fn osstr_opt_user_override() { + use std::ffi::OsStr; + let default = OsStr::new("default"); + + let r = App::new("df") + .arg( Arg::from_usage("--opt [FILE] 'some arg'") + .default_value_os(default)) + .get_matches_from_safe(vec!["", "--opt", "value"]); + assert!(r.is_ok()); + let m = r.unwrap(); + assert!(m.is_present("opt")); + assert_eq!(m.value_of("opt").unwrap(), "value"); +} + +#[test] +fn osstr_positionals() { + use std::ffi::OsStr; + let expected = OsStr::new("default"); + + let r = App::new("df") + .arg( Arg::from_usage("[arg] 'some opt'") + .default_value_os(expected)) + .get_matches_from_safe(vec![""]); + assert!(r.is_ok()); + let m = r.unwrap(); + assert!(m.is_present("arg")); + assert_eq!(m.value_of("arg").unwrap(), expected); +} + +#[test] +fn osstr_positional_user_override() { + use std::ffi::OsStr; + let default = OsStr::new("default"); + + let r = App::new("df") + .arg( Arg::from_usage("[arg] 'some arg'") + .default_value_os(default)) + .get_matches_from_safe(vec!["", "value"]); + assert!(r.is_ok()); + let m = r.unwrap(); + assert!(m.is_present("arg")); + assert_eq!(m.value_of("arg").unwrap(), "value"); +} + // --- Default if arg is present #[test] @@ -368,4 +430,4 @@ fn conditional_reqs_pass() { let m = m.unwrap(); assert_eq!(m.value_of("output"), Some("other")); assert_eq!(m.value_of("input"), Some("some")); -} \ No newline at end of file +}