Version 1.8: Transformers, default strings, and flags
Set handling has been completely replaced by a new backend that works as a Validator or Transformer. This provides a single interface instead of the 16 different functions in App. It also allows ordered collections to be used, custom functions for filtering, and better help and error messages. You can also use a collection of pairs (like std::map
) to transform the match into an output. Also new are inverted flags, which can cancel or reduce the count of flags, and can also support general flag types. A new add_option_fn
lets you more easily program CLI11 options with the types you choose. Vector options now support a custom separator. Apps can now be composed with unnamed subcommand support. The final bool "defaults" flag when creating options has been replaced by ->capture_default_str()
(ending an old limitation in construction made this possible); the old method is still available but may be removed in future versions.
- Replaced default help capture:
.add_option("name", value, "", True)
becomes.add_option("name", value)->capture_default_str()
#242 - Added
.always_capture_default()
#242 - New
CLI::IsMember
validator replaces set validation #222 - IsMember also supports container of pairs, transform allows modification of result #228
- Added new Transformers,
CLI::AsNumberWithUnit
andCLI::AsSizeValue
#253 - Much more powerful flags with different values #211, general types #235
add_option
now supports bool due to unified bool handling #211- Support for composable unnamed subcommands #216
- Reparsing is better supported with
.remaining_for_passthrough()
#265 - Custom vector separator using
->delimiter(char)
#209, #221, #240 - Validators added for IP4 addresses and positive numbers #210 and numbers #262
- Minimum required Boost for optional Optionals has been corrected to 1.61 #226
- Positionals can stop options from being parsed with
app.positionals_at_end()
#223 - Added
validate_positionals
#262 - Positional parsing is much more powerful #251, duplicates supported []#247]
- Validators can be negated with
!
#230, and now handle tname functions #228 - Better enum support and streaming helper #233 and #228
- Cleanup for shadow warnings #232
- Better alignment on multiline descriptions #269
- Better support for aarch64 #266
- Respect
BUILD_TESTING
only if CLI11 is the main project; otherwise,CLI11_TESTING
must be used #277 - Drop auto-detection of experimental optional and boost::optional; must be enabled explicitly (too fragile) #277 #279
Converting from CLI11 1.7:
.add_option(..., true)
should be replaced by.add_option(...)->capture_default_str()
orapp.option_defaults()->always_capture_default()
can be usedapp.add_set("--name", value, {"choice1", "choice2"})
should becomeapp.add_option("--name", value)->check(CLI::IsMember({"choice1", "choice2"}))
- The
_ignore_case
version of this can be replaced by addingCLI::ignore_case
to the argument list inIsMember
- The
_ignore_underscore
version of this can be replaced by addingCLI::ignore_underscore
to the argument list inIsMember
- The
_ignore_case_underscore
version of this can be replaced by adding both functions listed above to the argument list inIsMember
- If you want an exact match to the original choice after one of the modifier functions matches, use
->transform
instead of->check
- The
_mutable
versions of this can be replaced by passing a pointer or shared pointer intoIsMember
- An error with sets now produces a
ValidationError
instead of aConversionError