Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a ArgumentParser::add_hidden_alias_for() method #330

Merged
merged 1 commit into from
Mar 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
* [Parent Parsers](#parent-parsers)
* [Subcommands](#subcommands)
* [Parse Known Args](#parse-known-args)
* [Hidden alias](#hidden-alias)
* [ArgumentParser in bool Context](#argumentparser-in-bool-context)
* [Custom Prefix Characters](#custom-prefix-characters)
* [Custom Assignment Characters](#custom-assignment-characters)
Expand Down Expand Up @@ -970,6 +971,20 @@ int main(int argc, char *argv[]) {
}
```

### Hidden alias

It is sometimes desirable to offer an alias for an argument, but without it
appearing it in the usage. For example, to phase out a deprecated wording of
an argument while not breaking backwards compatible. This can be done with
the ``ArgumentParser::add_hidden_alias_for()` method.

```cpp
argparse::ArgumentParser program("test");

auto &arg = program.add_argument("--suppress").flag();
program.add_hidden_alias_for(arg, "--supress"); // old misspelled alias
```

### ArgumentParser in bool Context

An `ArgumentParser` is `false` until it (or one of its subparsers) have extracted
Expand Down
15 changes: 15 additions & 0 deletions include/argparse/argparse.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1578,6 +1578,21 @@ class ArgumentParser {
return *this;
}

// Add a un-documented/hidden alias for an argument.
// Ideally we'd want this to be a method of Argument, but Argument
// does not own its owing ArgumentParser.
ArgumentParser &add_hidden_alias_for(Argument &arg, std::string_view alias) {
for (auto it = m_optional_arguments.begin();
it != m_optional_arguments.end(); ++it) {
if (&(*it) == &arg) {
m_argument_map.insert_or_assign(std::string(alias), it);
return *this;
}
}
throw std::logic_error(
"Argument is not an optional argument of this parser");
}

/* Getter for arguments and subparsers.
* @throws std::logic_error in case of an invalid argument or subparser name
*/
Expand Down
1 change: 1 addition & 0 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ file(GLOB ARGPARSE_TEST_SOURCES
test_parse_known_args.cpp
test_equals_form.cpp
test_prefix_chars.cpp
test_hidden_alias.cpp
)
set_source_files_properties(main.cpp
PROPERTIES
Expand Down
18 changes: 18 additions & 0 deletions test/test_hidden_alias.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#ifdef WITH_MODULE
import argparse;
#else
#include <argparse/argparse.hpp>
#endif
#include <doctest.hpp>

using doctest::test_suite;

TEST_CASE("Test setting a hidden alias for an argument" *
test_suite("hidden_alias")) {
argparse::ArgumentParser program("test");
auto &arg = program.add_argument("--suppress").flag();
program.add_hidden_alias_for(arg, "--supress"); // old misspelled alias

program.parse_args({"./test.exe", "--supress"});
REQUIRE(program.get<bool>("--suppress") == true);
}
Loading