mirror of
https://github.com/clap-rs/clap
synced 2024-12-14 14:52:33 +00:00
Merge pull request #1243 from durka/flexible-validator
imp: make Arg::validator more flexible (v3)
This commit is contained in:
commit
9981bac22a
2 changed files with 22 additions and 8 deletions
|
@ -1830,11 +1830,11 @@ impl<'a, 'b> Arg<'a, 'b> {
|
||||||
/// [`Result`]: https://doc.rust-lang.org/std/result/enum.Result.html
|
/// [`Result`]: https://doc.rust-lang.org/std/result/enum.Result.html
|
||||||
/// [`Err(String)`]: https://doc.rust-lang.org/std/result/enum.Result.html#variant.Err
|
/// [`Err(String)`]: https://doc.rust-lang.org/std/result/enum.Result.html#variant.Err
|
||||||
/// [`Rc`]: https://doc.rust-lang.org/std/rc/struct.Rc.html
|
/// [`Rc`]: https://doc.rust-lang.org/std/rc/struct.Rc.html
|
||||||
pub fn validator<F>(mut self, f: F) -> Self
|
pub fn validator<F, O, E>(mut self, f: F) -> Self
|
||||||
where
|
where F: Fn(String) -> Result<O, E> + 'static,
|
||||||
F: Fn(String) -> Result<(), String> + 'static,
|
E: ToString
|
||||||
{
|
{
|
||||||
self.validator = Some(Rc::new(f));
|
self.validator = Some(Rc::new(move |s| f(s).map(|_| ()).map_err(|e| e.to_string())));
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1868,11 +1868,10 @@ impl<'a, 'b> Arg<'a, 'b> {
|
||||||
/// [`Result`]: https://doc.rust-lang.org/std/result/enum.Result.html
|
/// [`Result`]: https://doc.rust-lang.org/std/result/enum.Result.html
|
||||||
/// [`Err(String)`]: https://doc.rust-lang.org/std/result/enum.Result.html#variant.Err
|
/// [`Err(String)`]: https://doc.rust-lang.org/std/result/enum.Result.html#variant.Err
|
||||||
/// [`Rc`]: https://doc.rust-lang.org/std/rc/struct.Rc.html
|
/// [`Rc`]: https://doc.rust-lang.org/std/rc/struct.Rc.html
|
||||||
pub fn validator_os<F>(mut self, f: F) -> Self
|
pub fn validator_os<F, O>(mut self, f: F) -> Self
|
||||||
where
|
where F: Fn(&OsStr) -> Result<O, OsString> + 'static
|
||||||
F: Fn(&OsStr) -> Result<(), OsString> + 'static,
|
|
||||||
{
|
{
|
||||||
self.validator_os = Some(Rc::new(f));
|
self.validator_os = Some(Rc::new(move |s| f(s).map(|_| ())));
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
15
tests/env.rs
15
tests/env.rs
|
@ -240,6 +240,21 @@ fn validator() {
|
||||||
assert_eq!(m.value_of("arg").unwrap(), "env");
|
assert_eq!(m.value_of("arg").unwrap(), "env");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn validator_output() {
|
||||||
|
env::set_var("CLP_TEST_ENV", "42");
|
||||||
|
|
||||||
|
let r = App::new("df")
|
||||||
|
.arg(
|
||||||
|
Arg::from_usage("[arg] 'some opt'")
|
||||||
|
.env("CLP_TEST_ENV")
|
||||||
|
.validator(|s| s.parse::<i32>())
|
||||||
|
)
|
||||||
|
.get_matches_from_safe(vec![""]);
|
||||||
|
|
||||||
|
assert_eq!(r.unwrap().value_of("arg").unwrap().parse(), Ok(42));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn validator_invalid() {
|
fn validator_invalid() {
|
||||||
env::set_var("CLP_TEST_ENV", "env");
|
env::set_var("CLP_TEST_ENV", "env");
|
||||||
|
|
Loading…
Reference in a new issue