Skip to content

Commit

Permalink
Limiting choices support to string type or integer type
Browse files Browse the repository at this point in the history
  • Loading branch information
p-ranav committed Oct 27, 2023
1 parent 0b8d0e2 commit 6d49d5e
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 1 deletion.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1080,7 +1080,7 @@ foo@bar:/home/dev/$ ./main fex
Invalid argument "fex" - allowed options: {foo, bar, baz}
```

Using choices also works in integer types, e.g.,
Using choices also works with integer types, e.g.,

```cpp
argparse::ArgumentParser program("test");
Expand Down
10 changes: 10 additions & 0 deletions include/argparse/argparse.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,15 @@ struct can_invoke_to_string {
static constexpr bool value = decltype(test<T>(0))::value;
};

template <typename T>
struct is_choice_type_supported {
using CleanType = typename std::decay<T>::type;
static const bool value = std::is_integral<CleanType>::value ||
std::is_same<CleanType, std::string>::value ||
std::is_same<CleanType, std::string_view>::value ||
std::is_same<CleanType, const char*>::value;
};

} // namespace details

enum class nargs_pattern { optional, any, at_least_one };
Expand Down Expand Up @@ -546,6 +555,7 @@ class Argument {

template <typename T>
void add_choice(T&& choice) {
static_assert(details::is_choice_type_supported<T>::value, "Only string or integer type supported for choice");
static_assert(std::is_convertible_v<T, std::string_view> || details::can_invoke_to_string<T>::value, "Choice is not convertible to string_type");
if (!m_choices.has_value()) {
m_choices = std::vector<std::string>{};
Expand Down

0 comments on commit 6d49d5e

Please sign in to comment.