mirror of
https://github.com/clap-rs/clap
synced 2024-12-14 14:52:33 +00:00
b9cc585997
This gives users the basic error template for quick and dirty messages.
In addition to the lack of customization, they are not given anything to help
them with coloring or for programmayic use (info, source).
This is something I've wanted many times for one-off validation that
can't be expressed with clap's validation or it just wasn't worth
the hoops. The more pressing need is for #2255, I need `clap_derive`
to be able to create error messages and `Error::with_description` seemed
too disjoint from the rest of the clap experience that it seemed like
users would immediately create issues about it showing up.
With this available, I've gone ahead and deprecated
`Error::with_description` (added in 58512f2fc
), assuming this will be
sufficient for users needs (or they can use IO Errors as a back door).
I did so according to the pattern in #2718 despite us not being fully
resolved on that approach yet.
89 lines
3.1 KiB
Rust
89 lines
3.1 KiB
Rust
#![allow(unused_imports, dead_code)]
|
|
|
|
use std::io::{Cursor, Write};
|
|
use std::str;
|
|
|
|
use regex::Regex;
|
|
|
|
use clap::{App, Arg, ArgGroup};
|
|
|
|
pub fn compare<S, S2>(l: S, r: S2) -> bool
|
|
where
|
|
S: AsRef<str>,
|
|
S2: AsRef<str>,
|
|
{
|
|
let re = Regex::new("\x1b[^m]*m").unwrap();
|
|
// Strip out any mismatching \r character on windows that might sneak in on either side
|
|
let ls = l.as_ref().replace("\r", "");
|
|
let rs = r.as_ref().replace("\r", "");
|
|
let left_ = re.replace_all(&*ls, "");
|
|
let right = re.replace_all(&*rs, "");
|
|
let b = left_ == right;
|
|
if !b {
|
|
dbg!(&left_);
|
|
dbg!(&right);
|
|
println!();
|
|
println!("--> left");
|
|
println!("{}", left_);
|
|
println!("--> right");
|
|
println!("{}", right);
|
|
println!("--")
|
|
}
|
|
b
|
|
}
|
|
|
|
pub fn compare_output(l: App, args: &str, right: &str, stderr: bool) -> bool {
|
|
let mut buf = Cursor::new(Vec::with_capacity(50));
|
|
let res = l.try_get_matches_from(args.split(' ').collect::<Vec<_>>());
|
|
let err = res.unwrap_err();
|
|
write!(&mut buf, "{}", err).unwrap();
|
|
let content = buf.into_inner();
|
|
let left = String::from_utf8(content).unwrap();
|
|
assert_eq!(
|
|
stderr,
|
|
err.use_stderr(),
|
|
"Should Use STDERR failed. Should be {} but is {}",
|
|
stderr,
|
|
err.use_stderr()
|
|
);
|
|
compare(left, right)
|
|
}
|
|
|
|
// Legacy tests from the python script days
|
|
|
|
pub fn complex_app() -> App<'static> {
|
|
let opt3_vals = ["fast", "slow"];
|
|
let pos3_vals = ["vi", "emacs"];
|
|
|
|
App::new("clap-test")
|
|
.version("v1.4.8")
|
|
.about("tests clap library")
|
|
.author("Kevin K. <kbknapp@gmail.com>")
|
|
.arg("-o --option=[opt]... 'tests options'")
|
|
.arg("[positional] 'tests positionals'")
|
|
.arg(Arg::from("-f --flag... 'tests flags'").global(true))
|
|
.args(&[
|
|
Arg::from("[flag2] -F 'tests flags with exclusions'")
|
|
.conflicts_with("flag")
|
|
.requires("long-option-2"),
|
|
Arg::from("--long-option-2 [option2] 'tests long options with exclusions'")
|
|
.conflicts_with("option")
|
|
.requires("positional2"),
|
|
Arg::from("[positional2] 'tests positionals with exclusions'"),
|
|
Arg::from("-O --Option [option3] 'specific vals'").possible_values(opt3_vals),
|
|
Arg::from("[positional3]... 'tests specific values'").possible_values(pos3_vals),
|
|
Arg::from("--multvals [one] [two] 'Tests multiple values, not mult occs'"),
|
|
Arg::from("--multvalsmo... [one] [two] 'Tests multiple values, and mult occs'"),
|
|
Arg::from("--minvals2 [minvals]... 'Tests 2 min vals'").min_values(2),
|
|
Arg::from("--maxvals3 [maxvals]... 'Tests 3 max vals'").max_values(3),
|
|
])
|
|
.subcommand(
|
|
App::new("subcmd")
|
|
.about("tests subcommands")
|
|
.version("0.1")
|
|
.author("Kevin K. <kbknapp@gmail.com>")
|
|
.arg("-o --option [scoption]... 'tests options'")
|
|
.arg("-s --subcmdarg [subcmdarg] 'tests other args'")
|
|
.arg("[scpositional] 'tests positionals'"),
|
|
)
|
|
}
|