Skip to content

Commit

Permalink
feat(Defult Values): adds support for default values in args
Browse files Browse the repository at this point in the history
Closes #418
  • Loading branch information
kbknapp committed Feb 10, 2016
1 parent e76d751 commit 7321195
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 8 deletions.
19 changes: 19 additions & 0 deletions src/app/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,7 @@ impl<'a, 'b> Parser<'a, 'b> where 'a: 'b {
}
}

try!(self.add_defaults(matcher));
try!(self.validate_blacklist(matcher));
try!(self.validate_num_args(matcher));
matcher.usage(self.create_usage(&[]));
Expand Down Expand Up @@ -1518,4 +1519,22 @@ impl<'a, 'b> Parser<'a, 'b> where 'a: 'b {
}
w.flush().map_err(Error::from)
}

fn add_defaults(&mut self, matcher: &mut ArgMatcher<'a>) -> ClapResult<()> {
macro_rules! add_val {
($_self:ident, $a:ident, $m:ident) => {
if $m.get($a.name).is_none() {
try!($_self.add_val_to_arg($a, OsStr::new($a.default_val.as_ref().unwrap()), $m));
arg_post_processing!($_self, $a, $m);
}
};
}
for o in self.opts.iter().filter(|o| o.default_val.is_some()) {
add_val!(self, o, matcher);
}
for p in self.positionals.values().filter(|p| p.default_val.is_some()) {
add_val!(self, p, matcher);
}
Ok(())
}
}
39 changes: 31 additions & 8 deletions src/args/arg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ pub struct Arg<'a, 'b> where 'a: 'b {
pub settings: ArgFlags,
#[doc(hidden)]
pub val_delim: Option<char>,
#[doc(hidden)]
pub default_val: Option<&'a str>,
}

impl<'a, 'b> Default for Arg<'a, 'b> {
Expand All @@ -88,6 +90,7 @@ impl<'a, 'b> Default for Arg<'a, 'b> {
overrides: None,
settings: ArgFlags::new(),
val_delim: Some(','),
default_val: None,
}
}
}
Expand Down Expand Up @@ -1087,14 +1090,23 @@ impl<'a, 'b> Arg<'a, 'b> {
self
}

#[doc(hidden)]
pub fn setb(&mut self, s: ArgSettings) {
self.settings.set(s);
}

#[doc(hidden)]
pub fn unsetb(&mut self, s: ArgSettings) {
self.settings.unset(s);
/// Specifies the value of the argument when *not* used at runtime.
///
/// **NOTE:** implicitly sets `Arg::takes_value(true)`
///
/// # Examples
///
/// ```rust
/// # use clap::{App, Arg};
/// Arg::with_name("input")
/// .long("option")
/// .default_value("myval")
/// # ;
/// ```
pub fn default_value(mut self, val: &'a str) -> Self {
self.setb(ArgSettings::TakesValue);
self.default_val = Some(val);
self
}

/// Checks if one of the `ArgSettings` settings is set for the argument
Expand All @@ -1113,6 +1125,16 @@ impl<'a, 'b> Arg<'a, 'b> {
self.unsetb(s);
self
}

#[doc(hidden)]
pub fn setb(&mut self, s: ArgSettings) {
self.settings.set(s);
}

#[doc(hidden)]
pub fn unsetb(&mut self, s: ArgSettings) {
self.settings.unset(s);
}
}

impl<'a, 'b, 'z> From<&'z Arg<'a, 'b>>
Expand All @@ -1136,6 +1158,7 @@ impl<'a, 'b, 'z> From<&'z Arg<'a, 'b>>
overrides: a.overrides.clone(),
settings: a.settings.clone(),
val_delim: a.val_delim,
default_val: a.default_val,
}
}
}
3 changes: 3 additions & 0 deletions src/args/arg_builder/option.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ pub struct OptBuilder<'n, 'e> {
pub overrides: Option<Vec<&'e str>>,
pub settings: ArgFlags,
pub val_delim: Option<char>,
pub default_val: Option<&'n str>,
}

impl<'n, 'e> Default for OptBuilder<'n, 'e> {
Expand All @@ -46,6 +47,7 @@ impl<'n, 'e> Default for OptBuilder<'n, 'e> {
overrides: None,
settings: ArgFlags::new(),
val_delim: Some(','),
default_val: None,
}
}
}
Expand Down Expand Up @@ -79,6 +81,7 @@ impl<'n, 'e> OptBuilder<'n, 'e> {
requires: a.requires.clone(),
possible_vals: a.possible_vals.clone(),
settings: a.settings.clone(),
default_val: a.default_val,
..Default::default()
};
if let Some(ref vec) = ob.val_names {
Expand Down
3 changes: 3 additions & 0 deletions src/args/arg_builder/positional.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ pub struct PosBuilder<'n, 'e> {
pub overrides: Option<Vec<&'e str>>,
pub settings: ArgFlags,
pub val_delim: Option<char>,
pub default_val: Option<&'n str>,
}

impl<'n, 'e> Default for PosBuilder<'n, 'e> {
Expand All @@ -45,6 +46,7 @@ impl<'n, 'e> Default for PosBuilder<'n, 'e> {
overrides: None,
settings: ArgFlags::new(),
val_delim: Some(','),
default_val: None,
}
}
}
Expand Down Expand Up @@ -80,6 +82,7 @@ impl<'n, 'e> PosBuilder<'n, 'e> {
help: a.help,
val_delim: a.val_delim,
settings: a.settings.clone(),
default_val: a.default_val,
..Default::default()
};
if a.max_vals.is_some()
Expand Down

0 comments on commit 7321195

Please sign in to comment.