Skip to content
This repository was archived by the owner on Nov 9, 2022. It is now read-only.

Commit bad5d19

Browse files
committed
add env key for help msg
1 parent f254807 commit bad5d19

File tree

12 files changed

+221
-152
lines changed

12 files changed

+221
-152
lines changed

src/app/help.rs

Lines changed: 177 additions & 124 deletions
Large diffs are not rendered by default.

src/app/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1796,7 +1796,7 @@ impl<'n, 'e> AnyArg<'n, 'e> for App<'n, 'e> {
17961796
fn default_vals_ifs(&self) -> Option<map::Values<(&'n str, Option<&'e OsStr>, &'e OsStr)>> {
17971797
None
17981798
}
1799-
fn from_env(&self) -> Option<&OsString> { None }
1799+
fn env<'s>(&'s self) -> Option<(&'n OsStr, &'s OsString)> { None }
18001800
fn longest_filter(&self) -> bool { true }
18011801
fn aliases(&self) -> Option<Vec<&'e str>> {
18021802
if let Some(ref aliases) = self.p.meta.aliases {

src/app/parser.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1789,19 +1789,19 @@ impl<'a, 'b> Parser<'a, 'b>
17891789
Ok(())
17901790
}
17911791

1792-
pub fn add_from_env(&mut self, matcher: &mut ArgMatcher<'a>) -> ClapResult<()> {
1792+
pub fn add_env(&mut self, matcher: &mut ArgMatcher<'a>) -> ClapResult<()> {
17931793
macro_rules! add_val {
17941794
($_self:ident, $a:ident, $m:ident) => {
1795-
if let Some(ref val) = $a.v.from_env {
1795+
if let Some(ref val) = $a.v.env {
17961796
if $m.get($a.b.name).map(|ma| ma.vals.len()).map(|len| len == 0).unwrap_or(false) {
1797-
$_self.add_val_to_arg($a, OsStr::new(val), $m)?;
1797+
$_self.add_val_to_arg($a, OsStr::new(&val.1), $m)?;
17981798

17991799
if $_self.cache.map_or(true, |name| name != $a.name()) {
18001800
arg_post_processing!($_self, $a, $m);
18011801
$_self.cache = Some($a.name());
18021802
}
18031803
} else {
1804-
$_self.add_val_to_arg($a, OsStr::new(val), $m)?;
1804+
$_self.add_val_to_arg($a, OsStr::new(&val.1), $m)?;
18051805

18061806
if $_self.cache.map_or(true, |name| name != $a.name()) {
18071807
arg_post_processing!($_self, $a, $m);

src/app/validator.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ impl<'a, 'b, 'z> Validator<'a, 'b, 'z> {
2828
-> ClapResult<()> {
2929
debugln!("Validator::validate;");
3030
let mut reqs_validated = false;
31-
self.0.add_from_env(matcher)?;
31+
self.0.add_env(matcher)?;
3232
self.0.add_defaults(matcher)?;
3333
if let ParseResult::Opt(a) = needs_val_of {
3434
debugln!("Validator::validate: needs_val_of={:?}", a);

src/args/any_arg.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ pub trait AnyArg<'n, 'e>: std_fmt::Display {
3333
fn long_help(&self) -> Option<&'e str>;
3434
fn default_val(&self) -> Option<&'e OsStr>;
3535
fn default_vals_ifs(&self) -> Option<map::Values<(&'n str, Option<&'e OsStr>, &'e OsStr)>>;
36-
fn from_env(&self) -> Option<&OsString>;
36+
fn env<'s>(&'s self) -> Option<(&'n OsStr, &'s OsString)>;
3737
fn longest_filter(&self) -> bool;
3838
fn val_terminator(&self) -> Option<&'e str>;
3939
}

src/args/arg.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ impl<'a, 'b> Arg<'a, 'b> {
128128
"default_value" => yaml_to_str!(a, v, default_value),
129129
"default_value_if" => yaml_tuple3!(a, v, default_value_if),
130130
"default_value_ifs" => yaml_tuple3!(a, v, default_value_if),
131-
"from_env" => yaml_to_str!(a, v, from_env),
131+
"env" => yaml_to_str!(a, v, env),
132132
"value_names" => yaml_vec_or_str!(v, a, value_name),
133133
"groups" => yaml_vec_or_str!(v, a, group),
134134
"requires" => yaml_vec_or_str!(v, a, requires),
@@ -3315,10 +3315,10 @@ impl<'a, 'b> Arg<'a, 'b> {
33153315
/// Specifies that if the value is not passed in as an argument, that it should be retrieved
33163316
/// from the environment if available. If it is not present in the environment, then default
33173317
/// rules will apply.
3318-
pub fn from_env<K: AsRef<OsStr>>(mut self, name: K) -> Self {
3318+
pub fn env(mut self, name: &'a OsStr) -> Self {
33193319
self.setb(ArgSettings::TakesValue);
33203320

3321-
self.v.from_env = env::var_os(name);
3321+
self.v.env = env::var_os(name).map(|value| (name, value));
33223322
self
33233323
}
33243324

src/args/arg_builder/flag.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ impl<'n, 'e> AnyArg<'n, 'e> for FlagBuilder<'n, 'e> {
8989
fn default_vals_ifs(&self) -> Option<map::Values<(&'n str, Option<&'e OsStr>, &'e OsStr)>> {
9090
None
9191
}
92-
fn from_env(&self) -> Option<&OsString> { None }
92+
fn env<'s>(&'s self) -> Option<(&'n OsStr, &'s OsString)> { None }
9393
fn longest_filter(&self) -> bool { self.s.long.is_some() }
9494
fn aliases(&self) -> Option<Vec<&'e str>> {
9595
if let Some(ref aliases) = self.s.aliases {

src/args/arg_builder/option.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,9 @@ impl<'n, 'e> AnyArg<'n, 'e> for OptBuilder<'n, 'e> {
140140
fn default_vals_ifs(&self) -> Option<map::Values<(&'n str, Option<&'e OsStr>, &'e OsStr)>> {
141141
self.v.default_vals_ifs.as_ref().map(|vm| vm.values())
142142
}
143-
fn from_env(&self) -> Option<&OsString> { self.v.from_env.as_ref() }
143+
fn env<'s>(&'s self) -> Option<(&'n OsStr, &'s OsString)> {
144+
self.v.env.as_ref().map(|&(key, ref value)| (key, value))
145+
}
144146
fn longest_filter(&self) -> bool { true }
145147
fn aliases(&self) -> Option<Vec<&'e str>> {
146148
if let Some(ref aliases) = self.s.aliases {

src/args/arg_builder/positional.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,12 @@ impl<'n, 'e> AnyArg<'n, 'e> for PosBuilder<'n, 'e> {
152152
self.v.default_vals_ifs.as_ref().map(|vm| vm.values())
153153
}
154154
fn default_val(&self) -> Option<&'e OsStr> { self.v.default_val }
155-
fn from_env(&self) -> Option<&OsString> { self.v.from_env.as_ref() }
155+
fn env<'s>(&'s self) -> Option<(&'n OsStr, &'s OsString)> {
156+
self.v
157+
.env
158+
.as_ref()
159+
.map(|&(key, ref value)| (key, value))
160+
}
156161
fn longest_filter(&self) -> bool { true }
157162
fn aliases(&self) -> Option<Vec<&'e str>> { None }
158163
}

src/args/arg_builder/valued.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ where
2121
pub val_delim: Option<char>,
2222
pub default_val: Option<&'b OsStr>,
2323
pub default_vals_ifs: Option<VecMap<(&'a str, Option<&'b OsStr>, &'b OsStr)>>,
24-
pub from_env: Option<OsString>,
24+
pub env: Option<(&'a OsStr, OsString)>,
2525
pub terminator: Option<&'b str>,
2626
}
2727

@@ -38,7 +38,7 @@ impl<'n, 'e> Default for Valued<'n, 'e> {
3838
val_delim: None,
3939
default_val: None,
4040
default_vals_ifs: None,
41-
from_env: None,
41+
env: None,
4242
terminator: None,
4343
}
4444
}

tests/default_vals.rs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -479,16 +479,3 @@ fn conditional_reqs_pass() {
479479
assert_eq!(m.value_of("output"), Some("other"));
480480
assert_eq!(m.value_of("input"), Some("some"));
481481
}
482-
483-
#[test]
484-
fn from_env_no_default() {
485-
std::env::set_var("CLP_TEST_ENV", "from_env");
486-
487-
let r = App::new("df")
488-
.arg(Arg::from_usage("[arg] 'some opt'").from_env("CLP_TEST_ENV"))
489-
.get_matches_from_safe(vec![""]);
490-
assert!(r.is_ok());
491-
let m = r.unwrap();
492-
// assert!(m.is_present("arg")); // TODO: should this be true?
493-
assert_eq!(m.value_of("arg").unwrap(), "from_env");
494-
}

tests/env.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
extern crate clap;
2+
extern crate regex;
3+
4+
use std::env;
5+
use std::ffi::OsStr;
6+
7+
use clap::{App, Arg, ErrorKind};
8+
9+
#[test]
10+
fn env_no_default() {
11+
env::set_var("CLP_TEST_ENV", "env");
12+
13+
let r = App::new("df")
14+
.arg(
15+
Arg::from_usage("[arg] 'some opt'").env(OsStr::new("CLP_TEST_ENV")),
16+
)
17+
.get_matches_from_safe(vec![""]);
18+
assert!(r.is_ok());
19+
let m = r.unwrap();
20+
// assert!(m.is_present("arg")); // TODO: should this be true?
21+
assert_eq!(m.value_of("arg").unwrap(), "env");
22+
}

0 commit comments

Comments
 (0)