184 Commits

Author SHA1 Message Date
Nicholas Devenish 1f2187b0e1 store_into: Accept float (by accepting generic floating point) 2025-01-26 21:11:42 +00:00
Pranav 22b54b8e62 Merge pull request #356 from elpaso/multiple-actions
FEATURE: multiple actions
2025-01-20 13:16:51 -05:00
Pranav e39aa895ab Merge pull request #386 from DapengFeng/master
support `store_into` std::filesystem::path
2025-01-20 13:14:56 -05:00
Pranav 01f4fa4537 Merge pull request #388 from geon6/bugfix/385_store_into
fix bug 385
2025-01-20 13:14:37 -05:00
Even Rouault 9b4c63a2d8 usage(): do not emit blank line when a single argument exceeds set_usage_max_line_width() 2025-01-20 15:55:01 +01:00
geon6 8bacffdf90 fix bug 385 2024-11-27 16:52:29 +08:00
DapengFeng ba077697d6 support store_into std::filesystem::path 2024-11-22 16:51:02 +08:00
Even Rouault 097bac1854 subparser: use full parser path instead of just parser name in usage() message 2024-11-08 20:49:15 +01:00
Pranav 84c02050ea Merge pull request #377 from Eng-MohamedHussien/fix/370_range_of_choices
Fix range of choices bug
2024-09-20 09:03:02 -04:00
Oren Cohen d40d2fcecf Dont force store_into to override default/explicit values if already set 2024-09-19 16:53:54 +03:00
Muhammad Hussein 43072b8e8c Fix range of choices bug
- Support range of choices.
- Add testcases for range of choices scenario.

fix #370
2024-09-03 18:08:50 +03:00
Nick T df58f9d140 Updated the min and max to deal with a macro in minwindef.h 2024-08-15 15:47:23 +12:00
Even Rouault 84b7b46ce5 Add argument name after 'Too few arguments' error
If a non-positional argument doesn't get the number of required values,
a generic "Too few arguments" error is generated, without its name, when
it is not the last argument (but if it is the last argument, we get its
name)
2024-05-27 19:21:29 +02:00
Érico Nogueira df43e47c00 parse_args(): work around GCC 12 warning bug.
This bug [1] causes GCC to emit a wrong warning when adding a short
string literal to a std::string. Wrapping the literal in a std::string
doesn't have a large impact and avoids the warning.

[1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105329
2024-05-20 14:50:02 -03:00
Alessandro Pasotti 8dead89026 FEATURE: multiple actions
Also fixes the incompatibility between store_into and scan and action:
when the three methods above were called, being all based on the
(unique) action, the last one would overwrite the previous ones.

This issue was making the parser strictly dependant on the order
of the scan/store_into/action calls making them mutually exclusive.
2024-05-09 09:53:34 +02:00
Even Rouault 5228c57938 do_from_chars(): initialize variable to fix Coverity Scan warning
The argparse.hpp copy inside GDAL has caused Coverity Scan to emit a
(false-positive) warning about x not being initialized.

```
________________________________________________________________________________________________________
*** CID 1544814:  Uninitialized variables  (UNINIT)
/gdal/apps/argparse/argparse.hpp: 257 in gdal_argparse::details::do_from_chars<unsigned char, (int)10>(std::basic_string_view<char, std::char_traits<char>>)()
251       if (ec == std::errc::invalid_argument) {
252         throw std::invalid_argument{"pattern '" + std::string(s) + "' not found"};
253       }
254       if (ec == std::errc::result_out_of_range) {
255         throw std::range_error{"'" + std::string(s) + "' not representable"};
256       }
>>>     CID 1544814:  Uninitialized variables  (UNINIT)
>>>     Using uninitialized value "x".
```

Let's initialize it to 0 to make the analyzer happy
2024-05-05 21:35:58 +02:00
Alessandro Pasotti b85a0a414d Add Argument::store_into(std::set<int||string> &var) method 2024-04-30 17:30:48 +02:00
Andrew Bell e54e459286 Pass type along to parse_number(). 2024-04-17 13:42:37 -04:00
Andrew Bell d141b8d2a1 Add support for general integer types in store_into. 2024-04-17 13:35:51 -04:00
Pranav 9550b0a88c Merge pull request #344 from rouault/At_least_one_followed_by_exactly_one
Fix parsing of a program that accepts a positional argument with 1:* cardinality followed by another positional argument with 1:1
2024-04-02 19:46:38 -04:00
Even Rouault 2c245a2c3b Fix parsing of a program that accepts a positional argument with 1:* cardinality followed by another positional argument with 1:1 2024-04-02 23:35:43 +02:00
Even Rouault 29367256d3 Add Argument::store_into(std::vector<int> &var) method 2024-04-02 23:22:53 +02:00
Even Rouault d7d2326f42 Add a Argument::hidden() method to prevent an argument from appearing in usage or help 2024-03-16 14:23:51 +01:00
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
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 https://github.com/OSGeo/gdal/pull/9445/commits/8bb3455eedb658b55911f33fe272b8045f85f2ec#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
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
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
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 Srinivas Kumar f5287e2f20 Closes #307 2023-11-13 14:16:26 -08:00
Pranav Srinivas Kumar 16e2a1da72 Added support for binary notation, e.g., 0b101 2023-11-05 19:06:50 -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
Alexey Ismagilov 33146122a2 NEW: suppress flag for subcommand
resolve #258
2023-11-05 15:23:15 +03: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 de4239483d Added logic and unit tests for the required flag in mutex_args 2023-11-04 15:36:01 -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 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