Skip to content

Commit

Permalink
api(Arg): add default_value_os
Browse files Browse the repository at this point in the history
Also add related tests, and reframe `default_value` in terms of
`defualt_value_os`.
  • Loading branch information
nuew committed Apr 24, 2017
1 parent dd485eb commit d5ef895
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 3 deletions.
12 changes: 10 additions & 2 deletions src/args/arg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down
64 changes: 63 additions & 1 deletion tests/default_vals.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down Expand Up @@ -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"));
}
}

0 comments on commit d5ef895

Please sign in to comment.