Update Rust crate clap to v4 #51
Reference in New Issue
Block a user
No description provided.
Delete Branch "renovate/clap-4.x"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
This PR contains the following updates:
3.2.22->4.0.7Release Notes
clap-rs/clap
v4.0.7Compare Source
Features
Fixes
#[group(skip)]onParserderivev4.0.6Compare Source
Features
v4.0.5Compare Source
v4.0.4Compare Source
Fixes
v4.0.3Compare Source
Fixes
--) suggestionsv4.0.2Compare Source
Fixes
SetFalseshould conflict with itself likeSetTrueandSetv4.0.1Compare Source
Fixes
#[clap(...)]attribute still worksv4.0.0Compare Source
Highlights
Arg::num_args(range)Clap has had several ways for controlling how many values will be captured without always being clear on how they interacted, including
Arg::multiple_values(true)Arg::number_of_values(4)Arg::min_values(2)Arg::max_values(20)Arg::takes_value(true)These have now all been collapsed into
Arg::num_argswhich accepts bothsingle values and ranges of values.
num_argscontrols how many raw argumentson the command line will be captured as values per occurrence and independent
of value delimiters.
See Issue 2688 for more background.
Polishing Help
Clap strives to give a polished CLI experience out of the box with little
ceremony. With some feedback that has accumulated over time, we took this
release as an opportunity to re-evaluate our
--helpoutput to make sure it ismeeting that goal.
In doing this evaluation, we wanted to keep in mind:
Before:
After:
--versionis available for showing the same thing (if the program has a version set)In talking to users, we found some that liked clap's
man-like experience.When deviating from this, we are making the assumption that those are more
power users and that the majority of users wouldn't look as favorably on being
consistent with
man.See Issue 4132 for more background.
More Dynamicism
Clap's API has focused on
&strfor performance but this can makedealing with owned data difficult, like
#[arg(default_value_t)]generating aString from the default value.
Additionally, to avoid
ArgMatchesfrom borrowing (and for some features wedecided to forgo), clap took the
&strargument IDs and hashed them. Thisprevented us from providing a usable API for iterating over existing arguments.
Now clap has switched to a string newtype that gives us the flexibility to
decide whether to use
&'static str,Cow<'static, str>for fast dynamic behavior, orBox<str>for dynamic behavior with small binary size.As an extension of that work, you can now call
ArgMatches::idsto iterateover the arguments and groups that were found when parsing. The newtype
Idwas used to prevent some classes of bugs and to make it easier to understand
when opaque Ids are used vs user-visible strings.
Clearing Out Deprecations
Instead of doing all development on clap 4.0.0, we implemented a lot of new features during clap 3's development, deprecating the old API while introducing the new API, including:
ArgActionValueParserAPIPathBuf(allowing invalid UTF-8)AppSettingsandArgSettingsenums with getters/settersMigrating
Steps:
-hand--helpoutput at a minimum (recommendation: trycmd for snapshot testing)arg.action(ArgAction::...)on each argument (StoreValuefor options andIncOccurrencesfor flags)cargo check --features clap/deprecatedand resolve all deprecation warningsdefault-features = false, runcargo add clap -F help,usage,error-contextcargo add clap -F wrap_helpunless you want to hard code line wrapsExample test (derive):
Example test (builder):
Note: the idiomatic / recommended way of specifying different types of args in the Builder API has changed:
Before
After:
In particular,
num_args(the replacement fortakes_value) will default appropriatelyfrom the
ArgActionand generally only needs to be set explicitly for theother
num_argsuse cases.Breaking Changes
Subtle changes (i.e. compiler won't catch):
arg!now sets one of (#3795):ArgAction::SetTrue, requiringArgMatches::get_flaginstead ofArgMatches::is_presentArgAction::Count, requiringArgMatches::get_countinstead ofArgMatches::occurrences_ofArgAction::Set, requiringArgMatches::get_oneinstead ofArgMatches::value_ofArgAction::Append, requiringArgMatches::get_manyinstead ofArgMatches::values_ofArgAction::Set,ArgAction::SetTrue, andArg::Action::SetFalsenowconflict by default to be like
ArgAction::StoreValueandArgAction::IncOccurrences, requiringcmd.args_override_self(true)to override instead (#4261)Args default action isArgAction::Set, rather thanArgAction::IncOccurrenceto reduce confusing magic through consistency (#2687, #4032, see also #3977)mut_argcan no longer be used to customize help and version arguments, instead disable them (Command::disable_help_flag,Command::disable_version_flag) and provide your own (#4056)Command,Arg,ArgGroup, andPossibleValue, assuming'static.stringfeature flag will enable support forStrings (#1041, #2150, #4223)arg!(--flag <value>)is now optional, instead of required. Add.required(true)at the end to restore the original behavior (#4206)help,usageanderror-context, requiring adding them back in ifdefault-features = false(#4236)""argument for external subcommands to make it easier to distinguish them from built-in commands (#3263)Arg::allow_hyphen_values, to be consistent withCommand::allow_hyphen_values(#4187)Arg::value_terminatormust be its own argument on the CLI rather than being in a delimited list (#4025)wrap_helpfeature flag, either enable it or hard code your wraps (#4258)DeriveDisplayOrderthe default and removed the setting. To sort help, setnext_display_order(None)(#2808)Command::next_display_orderinstead ofDeriveDisplayOrderand using its own initial display order value (#2808)Command::help_template(#4132)Command::help_template,Arg::help_heading, andCommand::subcommand_help_heading(#4132)COMMANDfor the value name. To get the old behavior, seeCommand::subcommand_help_headingandArg::subcommand_value_name(#4132, #4155)Command::help_template. (#4132, #4160)--helpand--versionlike anyArgAction::SetTrueflag (#3776)Arg::idasverbatimcasing, requiring updating of string references to other args like inconflicts_withorrequires(#3282)ValueEnumvariants will now show up in--help(#3312)Args, andArgGroupis created using the type's name, reserving it for future use (#2621, #4209)next_help_headingcan now leak out of a#[clap(flatten)], like all other command settings (#4222)Easier to catch changes:
ArgMatchesnow returns the argIds, rather than the values to reduce overhead and offer more flexibility. (#4072)Arg::number_of_values(average-across-occurrences) toArg::num_args(per-occurrence) (raw CLI args, not parsed values) (#2688, #4023)num_args(0)no longer impliestakes_value(true).multiple_values(true)(#4023)num_args(1)no longer impliesmultiple_values(true)(#4023)Arg::min_values(across all occurrences) withArg::num_args(N..)(per occurrence) to reduce confusion over different value count APIs (#4023)Arg::max_values(across all occurrences) withArg::num_args(1..=M)(per occurrence) to reduce confusion over different value count APIs (#4023)Arg::multiple_values(true)withArg::num_args(1..)andArg::multiple_values(false)withArg::num_args(0)to reduce confusion over different value count APIs (#4023)Arg::takes_value(true)withArg::num_args(1)andArg::takes_value(false)withArg::num_args(0)to reduce confusion over different value count APIsArg::require_value_delimiter, either users could useArg::value_delimiteror implement a custom parser withTypedValueParseras it was mostly to makemultiple_values(true)act likemultiple_values(false)and isn't needed anymore (#4026)Arg::new("help")andArg::new("version")no longer implicitly disable thebuilt-in flags and be copied to all subcommands, instead disable
the built-in flags (
Command::disable_help_flag,Command::disable_version_flag) and mark the custom flags asglobal(true). (#4056)Arg::short('h')no longer implicitly disables the short flag for help,instead disable
the built-in flags (
Command::disable_help_flag,Command::disable_version_flag) provide your ownArg::new("help").long("help").action(ArgAction::Help).global(true). (#4056)ArgAction::SetTrueandArgAction::SetFalsenow prioritizeArg::default_missing_valueover their standard behavior (#4000)Arg::requires_ifsandArg::default_value*_ifs*to taking anArgPredicate, removing ambiguity withNonewhen accepting owned and borrowed types (#4084)PartialEqandEqfromCommandso we could change external subcommands to use aValueParser(#3990)Arg,Command, andArgGroupcalls were switched from accepting&[]to[]viaIntoIteratorto be more flexible (#4072)Arg::short_aliasesand other builder functions that took&[]need the&dropped (#4081)ErrorKindandResultmoved into theerrormoduleErrorKind::EmptyValuereplaced withErrorKind::InvalidValueto remove an unnecessary special case (#3676, #3968)ErrorKind::UnrecognizedSubcommandreplaced withErrorKind::InvalidSubcommandto remove an unnecessary special case (#3676)allow_external_subcommandsfromStringtoOsStringas that is less likely to cause bugs in user applications (#3990)Command::render_usagenow returns aStyledStr(#4248)parsetovalue_parser, removingparsesupport (#3827, #3981)#[clap(value_parser)]and#[clap(action)]are now redundantsubcommand_required(true).arg_required_else_help(true)is set instead ofSubcommandRequiredElseHelpto give more meaningful errors when subcommands are missing and to reduce redundancy (#3280)arg_enumattribute in favor ofvalue_enumto match the new name (we didn't have support in v3 to mark it deprecated) (#4127)Arg::default_missing_valuedidn't requirenum_args(0..=N), now it does (#4023)Arg::longare no longer allowed (#3691)value_namesthannum_args(#2695)ArgAction::Versionis used#[track_caller]s to make it easier to debug assertsoverrides_withIDs are validoverrides_withnow that Actions replace itmut_argreceiving an invalid arg ID ormut_subcommandreceiving an invalid command nameCompatibility
MSRV is now 1.60.0
Deprecated
Arg::use_value_delimiterin favor ofArg::value_delimiterto avoid having multiple ways of doing the same thingArg::requires_allin favor ofArg::requires_ifsnow that it takes anArgPredicateto avoid having multiple ways of doing the same thingArg::number_of_valuesin favor ofArg::num_argsto clarify semantic differencesdefault_value_os,default_values_os,default_value_if_os, anddefault_value_ifs_osas the non_osvariants now accept either astror anOsStr(#4141)Arg::env_osin favor ofArg::envCommand::dont_collapse_args_in_usageis now the default (#4151)Command::trailing_var_argin favor ofArg::trailing_var_argto make it clearer which arg it is meant to apply to (#4187)Command::allow_hyphen_valuesin favor ofArg::allow_hyphen_valuesto make it clearer which arg it is meant to apply to (#4187)Command::allow_negative_numbersin favor ofArg::allow_negative_numbersto make it clearer which arg it is meant to apply to (#4187)Command::write_helpandCommand::write_long_helpin favor ofCommand::render_helpandCommand::render_long_help(#4248)structoptandclapattributes in favor of the more specificcommand,arg, andvalueto open the door for more features and clarify relationship to the builder (#1807, #4180)#[clap(value_parser)]and#[clap(action)]defaulted attributes (its the default) (#3976)Behavior Changes
wrap_helpfeature, if the terminal size cannot be determined,LINESandCOLUMNSvariables are used (#4186)Features
Arg::num_argsnow accepts ranges, allowing setting both the minimum and maximum number of values per occurrence (#2688, #4023)value_parsers forArgAction::SetTrue/ArgAction::SetFalse(#4092)From<&OsStr>,From<OsString>,From<&str>, andFrom<String>tovalue_parser!(#4257)Command,Arg,ArgGroup,PossibleValue, etc without managing lifetimes with thestringfeature flag (#2150, #4223)error-context,helpandusagefeature flags that can be turned off for smaller binaries (#4236)StyledStr::ansi()toDisplaywith ANSI escape codes (#4248)Error::applyfor changing the formatter for dropping binary size (#4111)Error::renderfor formatting the error into aStyledStrPossibleValue::helpin long help (--help) (#3312){tab}variable forCommand::help_template(#4161)Command::render_helpandCommand::render_long_helpfor formatting the error into aStyledStr(#3873, #4248)Command::render_usagenow returns aStyledStr(#4248)Fixes
requiredis not used with conditional required settings (#3660)cmd.allow_invalid_for_utf8_external_subcommandswithcmd.external_subcommand_value_parser(#3733)Arg::default_missing_valuenow applies per occurrence rather than if a value is missing across all occurrences (#3998)arg!(--long [value])to accept0..=1per occurrence rather than across all occurrences, making it safe to use withArgAction::Append(#4001)OsStrs forArg::{required_if_eq,required_if_eq_any,required_if_eq_all}(#4084)wrap_helpfeature, if the terminal size cannot be determined,LINESandCOLUMNSvariables are used (#4186)Command::display_namein the help title rather thanCommand::bin_nameArgAction::Countby adding an...(#4003)cmd help help(#4131)[positional]in list when relevant (#4144)[positional]in usage (#4151)-h/--helpwhen applicable (#4132, #4159)next_line_help, don't add blank lines (#4132, #4190)Command::display_namerather thanCommand::bin_name(#3966)""argument for external subcommands (#3263)Arg::allow_hyphen_values, likeCommand::allow_hyphen_values(#4187)InvalidSubcommandoverUnknownArgumentin more cases (#4219)Arg::idasverbatimcasing (#3282)#[clap(value_parser, action)]instead of#[clap(parse)](#3827)Configuration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR has been generated by Renovate Bot.