Skip to content

Commit

Permalink
Merge pull request #330 from rouault/hidden_alias
Browse files Browse the repository at this point in the history
Add a ArgumentParser::add_hidden_alias_for() method
  • Loading branch information
p-ranav authored Mar 12, 2024
2 parents c69d8e1 + e6e41d4 commit ce2d431
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 0 deletions.
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 @@ -1591,6 +1591,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);
}

0 comments on commit ce2d431

Please sign in to comment.