Commit Graph

731 Commits

Author SHA1 Message Date
Even Rouault
8f5b3e0722
Several bug fixes in usage, and improvement in usage and help
- Display mutually exclusive arguments as ``[[-a]|[-b]]`` in usage
- Add ... trailer to repeatable arguments in usage: ``[-x]...``

- Implement the following enhancements:

By default usage is reported on a single line.

The ``ArgumentParser::set_usage_max_line_width(width)`` method can be used
to display the usage() on multiple lines, by defining the maximum line width.

It can be combined with a call to ``ArgumentParser::set_usage_break_on_mutex()``
to ask grouped mutually exclusive arguments to be displayed on a separate line.

``ArgumentParser::add_usage_newline()`` can also be used to force the next
argument to be displayed on a new line in the usage output.

The following snippet

```cpp
    argparse::ArgumentParser program("program");
    program.set_usage_max_line_width(80);
    program.set_usage_break_on_mutex();
    program.add_argument("--quite-long-option-name").flag();
    auto &group = program.add_mutually_exclusive_group();
    group.add_argument("-a").flag();
    group.add_argument("-b").flag();
    program.add_argument("-c").flag();
    program.add_argument("--another-one").flag();
    program.add_argument("-d").flag();
    program.add_argument("--yet-another-long-one").flag();
    program.add_argument("--will-go-on-new-line").flag();
    program.add_usage_newline();
    program.add_argument("--new-line").flag();
    std::cout << program.usage() << std::endl;
```

will display:
```console
Usage: program [--help] [--version] [--quite-long-option-name]
               [[-a]|[-b]]
               [-c] [--another-one] [-d] [--yet-another-long-one]
               [--will-go-on-new-line]
               [--new-line]
```

Furthermore arguments can be separated into several groups by calling
``ArgumentParser::add_group(group_name)``. Only optional arguments should
be specified after the first call to add_group().

```cpp
    argparse::ArgumentParser program("program");
    program.set_usage_max_line_width(80);
    program.add_argument("-a").flag().help("help_a");
    program.add_group("Advanced options");
    program.add_argument("-b").flag().help("help_b");
```

will display:
```console
Usage: program [--help] [--version] [-a]

Advanced options:
               [-b]
```
2024-03-13 02:09:44 +01:00
Pranav
0fa7d59964
Merge pull request #332 from rouault/consume_dry_run
Add a dry_run argument to Argument::consume(), and change ArgumentParser private section to protected
2024-03-12 18:51:01 -04:00
Even Rouault
3a6118e4de
Fix clang-tidy warning 2024-03-12 15:36:54 +01:00
Even Rouault
f2e7db6090
Add a dry_run argument to Argument::consume(), and change ArgumentParser private section to protected
Both changes are needed in the special case of GDAL where our existing
hand-made argument parser accepts positional arguments placed anywhere
in the arguments, not just after optional arguments.

In the GDAL code, in 8bb3455eed (diff-4592e7daae8543536dbeadf05a3c110282ea0fc089216186138c923a0d4d8000R170) ,
I've implemented a preliminary pass before calling
ArgumentParser::process_args() that re-order arguments. For that, I need
to be able to call consume() but without side-effects (dry_run=False)
and accept members that are private
2024-03-12 15:30:05 +01:00
Pranav
874b939f13
Merge pull request #331 from rouault/store_into
Add Argument::store_into() functions
2024-03-12 10:13:31 -04:00
Pranav
ce2d4316a4
Merge pull request #330 from rouault/hidden_alias
Add a ArgumentParser::add_hidden_alias_for() method
2024-03-12 10:10:03 -04:00
Even Rouault
8784cc8ddf
Add Argument::store_into() functions
It is possible to bind arguments to a variable storing their value, as an
alternative to explicitly calling ``program.get<T>(arg_name)`` or ``program[arg_name]``

This is currently implementeted for variables of type ``bool`` (this also
implicitly calls ``flag()``), ``int``, ``double``, ``std::string`` and
``std::vector<std::string>``. If the argument is not specified in the command
line, the default value (if set) is set into the variable.

```cpp
bool flagvar = false;
program.add_argument("--flagvar").store_into(flagvar);

int intvar = 0;
program.add_argument("--intvar").store_into(intvar);

double doublevar = 0;
program.add_argument("--doublevar").store_into(doublevar);

std::string strvar;
program.add_argument("--strvar").store_into(strvar);

std::vector<std::string> strvar_repeated;
program.add_argument("--strvar-repeated").append().store_into(strvar_repeated);

std::vector<std::string> strvar_multi_valued;
program.add_argument("--strvar-multi-valued").nargs(2).store_into(strvar_multi_valued);
```
2024-03-12 12:50:22 +01:00
Even Rouault
e6e41d43c6
Add a ArgumentParser::add_hidden_alias_for() method
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
```
2024-03-12 12:08:40 +01:00
Pranav
c69d8e1960
Merge pull request #329 from rouault/custom_strtoX
Add ways to substitute strtof/strtod/strtold with custom functions
2024-03-12 06:59:52 -04:00
Even Rouault
c1fb3c0005
Add ways to substitute strtof/strtod/strtold with custom functions
The standard strtof/strtod/strtold are by default locale-aware. There
are a number of situations where we'd rather want to be able to use
locale-independent parsing functions. This can be done by setting the
ARGPARSE_CUSTOM_STRTOF/ARGPARSE_CUSTOM_STRTOD/ARGPARSE_CUSTOM_STRTOLD
macros to the appropriate value.
2024-03-12 10:23:02 +01:00
Pranav
20f0196321
Merge pull request #328 from rouault/make_unsigned-integer-overflow_happy
Make clang -fsanitize=unsigned-integer-overflow happy
2024-03-11 20:55:27 -04:00
Even Rouault
907b942db2
Change key of m_subparser_map and m_subparser_used to be a std::string to make clang -fsanitize=unsigned-integer-overflow happy 2024-03-11 22:37:14 +01:00
Even Rouault
c4406e2479
Change key of m_argument_map to be a std::string to make clang -fsanitize=unsigned-integer-overflow happy 2024-03-11 22:09:39 +01:00
Pranav
1b3abd9b92
Merge pull request #326 from stripe2933/master
Fix for C++23 standard library module usage.
2024-02-06 21:23:27 -05:00
LEE KYOUNGHEON
f9057b85a0
Update argparse.cppm
Fix typo
2024-02-06 17:10:14 +09:00
LEE KYOUNGHEON
6bdc003e15
Import std.compat module.
To use <cstdlib> feature, std.compat module should be imported.
2024-02-06 17:05:54 +09:00
LEE KYOUNGHEON
873596b41d
Move <errno> include outside the ARGPARSE_MODULE_USE_STD_MODULE
<errno> header exposes errno macro, which cannot be exported in C++ module. It must always included regardless of module usage.
2024-02-06 17:05:07 +09:00
Pranav
69dabd88a8
Merge pull request #310 from p-ranav/bugfix/307_choices
Bugfix/307 choices
2023-11-13 16:23:15 -06:00
Pranav Srinivas Kumar
d8aa2ba1db Added nargs test for multiple values to a choices() argument 2023-11-13 14:19:55 -08:00
Pranav Srinivas Kumar
f5287e2f20 Closes #307 2023-11-13 14:16:26 -08:00
Pranav
af442b4da0
Merge pull request #306 from p-ranav/feature/binary_number_parsing
Added support for binary notation, e.g., 0b101
2023-11-05 19:15:14 -06:00
Pranav Srinivas Kumar
16e2a1da72 Added support for binary notation, e.g., 0b101 2023-11-05 19:06:50 -06:00
Pranav
5effc4f206
Merge pull request #305 from p-ranav/bugfix/260_segfault_copy
Bumped version to v3.0 ahead of release
2023-11-05 18:32:32 -06:00
Pranav Srinivas Kumar
379ebb6b16 Bumped version to v3.0 ahead of release 2023-11-05 18:20:10 -06:00
Pranav
6a5fbf778c
Merge pull request #304 from p-ranav/bugfix/260_segfault_copy
Marked copy and move constructors as deleted
2023-11-05 18:18:20 -06:00
Pranav Srinivas Kumar
f84fa8484a Marked copy and move constructors as deleted 2023-11-05 18:13:17 -06:00
Pranav Srinivas Kumar
3596748798 Removed test code 2023-11-05 17:10:27 -06:00
Pranav
ef92a8523e
Merge pull request #302 from ismagilli/typo_in_readme
FIX: typo in README.txt
2023-11-05 07:59:32 -06:00
Pranav
3cc913d5ff
Merge pull request #273 from ismagilli/issue_258
NEW: suppress flag for subcommand
2023-11-05 07:58:02 -06:00
Alexey Ismagilov
634b1202b0 FIX: typo in README.txt 2023-11-05 16:05:55 +03:00
Alexey Ismagilov
33146122a2 NEW: suppress flag for subcommand
resolve #258
2023-11-05 15:23:15 +03:00
Pranav
086c8f3db0
Merge pull request #301 from p-ranav/feature/221_mutex_args
Closes #221
2023-11-04 15:54:37 -05:00
Pranav Srinivas Kumar
a9869150fd Changed from using std::set to std::vector for mutex_args elements 2023-11-04 15:51:22 -05:00
Pranav Srinivas Kumar
ecccae530c Using size_t for levenshtein distance 2023-11-04 15:48:13 -05:00
Pranav Srinivas Kumar
b43c0a7e83 Addressed clang-tidy issues 2023-11-04 15:46:41 -05:00
Pranav Srinivas Kumar
e0a095571f Updated README to include mutex_args feature 2023-11-04 15:41:48 -05:00
Pranav Srinivas Kumar
de4239483d Added logic and unit tests for the required flag in mutex_args 2023-11-04 15:36:01 -05:00
Pranav Srinivas Kumar
7bbde0defb Added unit test for 2 mutex_groups 2023-11-04 15:24:07 -05:00
Pranav Srinivas Kumar
8f70dde82e Added unit test for mutex_args with three arguments 2023-11-04 15:20:47 -05:00
Pranav Srinivas Kumar
eea95c0e3a Added mutex args to copy constructor, changed to ordered set for data structure 2023-11-04 15:19:10 -05:00
Pranav Srinivas Kumar
39988ec62d Initial commit for implementing MutuallyExclusiveGroup 2023-11-04 14:57:01 -05:00
Pranav Srinivas Kumar
281f1ab017 Closes #113, add custom std::ostream& argument to ArgumentParser constructor 2023-11-04 09:31:13 -05:00
Pranav Srinivas Kumar
7a3e0f1cb3 Added another unit test for optional argument error reporting 2023-11-04 09:17:59 -05:00
Pranav Srinivas Kumar
c6e64ae36d Simplified logic in error reporting, asking user if they meant to use a specific optional argument 2023-11-04 09:11:34 -05:00
Pranav Srinivas Kumar
62052fefcb Closes #285 2023-11-04 09:01:31 -05:00
Pranav Srinivas Kumar
7657a22001 Updated formatting of error message, showing all variations of argument name 2023-11-03 22:18:08 -05:00
Pranav Srinivas Kumar
78ba5e9828 Removed brackets and quotes in error message 2023-11-03 22:12:00 -05:00
Pranav Srinivas Kumar
4111905a74 Improved error reporting for #299 2023-11-03 22:05:46 -05:00
Pranav
ac4c578f60
Merge pull request #298 from cobyj33/cobyj33-fix-subdirectory-cmake-options
Set argparse to not run tests or set up install if not top level
2023-11-01 06:13:02 -05:00
cobyj33
e6d2628723 Set argparse to not run tests or set up install if not top level 2023-10-31 21:09:12 -05:00