From 2c097814e4a6c745cd584b2cd0d26bffd1e6b5f6 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Thu, 29 Sep 2022 09:43:33 -0500 Subject: [PATCH 1/2] test(error): Self-conflict --- tests/builder/conflicts.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/builder/conflicts.rs b/tests/builder/conflicts.rs index 44393ef4955..0ba653c43bd 100644 --- a/tests/builder/conflicts.rs +++ b/tests/builder/conflicts.rs @@ -309,6 +309,20 @@ For more information try '--help' ); } +#[test] +#[cfg(feature = "error-context")] +fn conflict_output_repeat() { + static ERR: &str = "\ +error: The argument '-F' cannot be used with '-F' + +Usage: clap-test [OPTIONS] [positional] [positional2] [positional3]... [COMMAND] + +For more information try '--help' +"; + + utils::assert_output(utils::complex_app(), "clap-test -F -F", ERR, true); +} + #[test] #[cfg(feature = "error-context")] fn conflict_output_with_required() { From 4e9f3cca2c27debe1920ada55d80199bb94c4a71 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Thu, 29 Sep 2022 09:53:28 -0500 Subject: [PATCH 2/2] fix(error): Specialize the self-conflicts error Inspired by rust-lang/cargo#11159 --- examples/tutorial_builder/03_01_flag_bool.md | 2 +- examples/tutorial_derive/03_01_flag_bool.md | 2 +- src/error/format.rs | 42 +++++++++++--------- tests/builder/conflicts.rs | 2 +- 4 files changed, 27 insertions(+), 21 deletions(-) diff --git a/examples/tutorial_builder/03_01_flag_bool.md b/examples/tutorial_builder/03_01_flag_bool.md index 0842935f3f2..71f6f906011 100644 --- a/examples/tutorial_builder/03_01_flag_bool.md +++ b/examples/tutorial_builder/03_01_flag_bool.md @@ -17,7 +17,7 @@ verbose: true $ 03_01_flag_bool --verbose --verbose ? failed -error: The argument '--verbose' cannot be used with '--verbose' +error: The argument '--verbose' was provided more than once, but cannot be used multiple times Usage: 03_01_flag_bool[EXE] [OPTIONS] diff --git a/examples/tutorial_derive/03_01_flag_bool.md b/examples/tutorial_derive/03_01_flag_bool.md index 77975698e35..83f57fa64d4 100644 --- a/examples/tutorial_derive/03_01_flag_bool.md +++ b/examples/tutorial_derive/03_01_flag_bool.md @@ -17,7 +17,7 @@ verbose: true $ 03_01_flag_bool_derive --verbose --verbose ? failed -error: The argument '--verbose' cannot be used with '--verbose' +error: The argument '--verbose' was provided more than once, but cannot be used multiple times Usage: 03_01_flag_bool_derive[EXE] [OPTIONS] diff --git a/src/error/format.rs b/src/error/format.rs index eec7867c561..15208b32ee8 100644 --- a/src/error/format.rs +++ b/src/error/format.rs @@ -90,26 +90,32 @@ fn write_dynamic_context(error: &crate::error::Error, styled: &mut StyledStr) -> if let (Some(ContextValue::String(invalid_arg)), Some(prior_arg)) = (invalid_arg, prior_arg) { - styled.none("The argument '"); - styled.warning(invalid_arg); - styled.none("' cannot be used with"); + if ContextValue::String(invalid_arg.clone()) == *prior_arg { + styled.none("The argument '"); + styled.warning(invalid_arg); + styled.none("' was provided more than once, but cannot be used multiple times"); + } else { + styled.none("The argument '"); + styled.warning(invalid_arg); + styled.none("' cannot be used with"); - match prior_arg { - ContextValue::Strings(values) => { - styled.none(":"); - for v in values { - styled.none("\n"); - styled.none(TAB); - styled.warning(&**v); + match prior_arg { + ContextValue::Strings(values) => { + styled.none(":"); + for v in values { + styled.none("\n"); + styled.none(TAB); + styled.warning(&**v); + } + } + ContextValue::String(value) => { + styled.none(" '"); + styled.warning(value); + styled.none("'"); + } + _ => { + styled.none(" one or more of the other specified arguments"); } - } - ContextValue::String(value) => { - styled.none(" '"); - styled.warning(value); - styled.none("'"); - } - _ => { - styled.none(" one or more of the other specified arguments"); } } true diff --git a/tests/builder/conflicts.rs b/tests/builder/conflicts.rs index 0ba653c43bd..dbee06b16e8 100644 --- a/tests/builder/conflicts.rs +++ b/tests/builder/conflicts.rs @@ -313,7 +313,7 @@ For more information try '--help' #[cfg(feature = "error-context")] fn conflict_output_repeat() { static ERR: &str = "\ -error: The argument '-F' cannot be used with '-F' +error: The argument '-F' was provided more than once, but cannot be used multiple times Usage: clap-test [OPTIONS] [positional] [positional2] [positional3]... [COMMAND]