Commit graph

2635 commits

Author SHA1 Message Date
Ed Page
af0751c757 fix: Further discourage direct use of ValueParserVia* 2022-06-10 10:30:48 -05:00
Ed Page
8b37be4b01 fix: Further discourage direct use of AutoValueParser 2022-06-10 10:29:06 -05:00
Ed Page
e70b3ff47b fix(parser): Always include pending arguments in errors
Found via cargo's UI tests
2022-06-09 13:41:24 -05:00
Ed Page
31b22d1a51 perf(parser): Take up less memory with ArgAction::Count
Someone should not reasonably expect a coun flag to go up to billions,
millions, or even thousands.  255 should be sufficient for anyone,
right?

The original type was selected to be consistent with
`ArgMatches::occurrences_of` but that is also used for tracking how
many values appear which can be large with `xargs`.

I'm still conflicted on what the "right type" is an wish we could
support any numeric type.  When I did a search on github though, every
case was for debug/quiet flags and only supported 2-3 occurrences,
making a `u8` overkill.

This came out of a discussion on #3792
2022-06-09 11:09:38 -05:00
Ed Page
acfb130b0d fix(parser): Prevent rollover of count 2022-06-09 11:05:06 -05:00
Ed Page
01b5e1ee5b perf(builder): Avoid Arc for value parsers
There isn't a strong need for the single-instance at the cost of the
extra book keeping.
2022-06-08 20:57:00 -05:00
Ed Page
d73ff562d1 fix(builder): Move trait requirements closer to the user
My hope is this will provide clearer error messages for the user.
2022-06-08 20:41:51 -05:00
Ed Page
4dc0136b2c fix(parser): Hide AnyValue
With `AnyValueParser` now private, we can also make `AnyValue` private.
Most users should not need to call `ValueParser::parse_ref` and doing
this gives us more implementation freedom for the future.
2022-06-08 20:22:39 -05:00
Ed Page
ebf21a3280 fix(assert): Don't assert in more cases 2022-06-08 17:39:14 -05:00
Ed Page
c61a105e62 fix(builder): Fix regression with auto-help / auto-version 2022-06-08 17:17:50 -05:00
Ed Page
035bc804d1 fix(builder): Dump action in debug output 2022-06-08 16:39:27 -05:00
Ed Page
3052fece16 fix(builder): Make it easier to debug globals 2022-06-08 16:35:56 -05:00
SabrinaJewson
6e49bf7419
refactor: Make AnyValueParser private 2022-06-08 20:36:55 +01:00
Ed Page
aba2a9e84d refactor(builder): Reduce visibility 2022-06-08 14:18:23 -05:00
Ed Page
10bb9abb1a fix(assert): Reference help_expected 2022-06-08 12:06:15 -05:00
Ed Page
28781d6773 fix(help): Deprecate NoAutoVersion/NoAutoHelp
I'm a bit disappointed we don't have a way to control the action for the
help subcommand.  Instead, people will need to provide their own and
disable ours.  Long term, I want to design actions for subcommands but I
don't think its worth keeping `NoAutoHelp` around for it.
2022-06-08 12:02:13 -05:00
Ed Page
dffd7932b3 fix(assert): Check for version if user specifies ArgAction::Version 2022-06-08 11:59:49 -05:00
Ed Page
9e38353442 fix(derive): Clarify ArgEnum as ValueEnum
We aren't enumerating arguments but values for an argument, so the name
should reflect that.

This will be important as part of #1807 when we have more specific
attribute names.
2022-06-08 11:14:09 -05:00
Ed Page
14a62e11fd fix(parser): Deprecate multiple_occurrences
Fixes #3772
2022-06-08 09:54:23 -05:00
Ed Page
b78a0e6ccd style: Make clippy happy 2022-06-08 09:34:20 -05:00
Ed Page
1abc945545 fix(parser): Process overrides with new Actions 2022-06-08 08:59:43 -05:00
Ed Page
7980c5ceb8 fix(parser): Force multiple occurrences with new Actions
This is needed for deprecate `multiple_occurrences`
2022-06-07 14:34:54 -05:00
Ed Page
d88ca13730 docs: Reflect the dropping of occurrences_of 2022-06-07 14:09:08 -05:00
Ed Page
86a162d1bb fix(parser): Deprecate occurrences_of
This mostly exist for
- Knowing of the value came from the command-line but we now have
  `ArgMatches::source`
- Counting the number of flags but we now have `ArgAction::Count`
2022-06-07 13:30:32 -05:00
Ed Page
1428785677 fix(parser): Deprecate args_override_self
This shouldn't be needed anymore now that this is effectively the new
behavior for the non-deprecated actions.

This was briefly talked about in
https://github.com/clap-rs/clap/discussions/2627 but I wasn't familiar
enough with the implementation to know how safe it is.  Now, maintainrs
and users can be more confident because they are explicitly opting into
it.

See also #3795
2022-06-06 14:57:24 -05:00
Ed Page
a979cf9bb8 fix(parser): Deprecate max_occurrences 2022-06-06 14:09:24 -05:00
Ed Page
0ba63664fe feat(builder): Offer u64 ranges 2022-06-06 14:02:01 -05:00
Ed Page
1879826b21 fix(parser): Deprecate StoreValue / IncOccurrences Actions
Dropping these will help simplify a lot, including removing of
occurrences.

These come at the cost of the derive not yet supporting types that impl
`From`.
2022-06-06 13:41:27 -05:00
Ed Page
4a694f3592 refactor(parser): Be explicit in checking present values 2022-06-06 12:21:47 -05:00
Ed Page
4489f09f10 feat(parser): Allow querying whether actions take values 2022-06-06 11:20:08 -05:00
Ed Page
0f1de7303d fix(validator): Ignore defaults for requireds
This is a follow up to #3420.  Its easy to overlook this because it is only
useful for the conditionals (we actually prevent applying unconditional
defaults to unconditional requireds).  This became apparent with the
increased use of defaults with `SetTrue`.

As always, there is the question of when is a bug fix a breaking change.
I'm going to consider this safe since we prevent some instances of this
from even happening and we already did #3420 and this is in line with
those.
2022-06-06 11:07:04 -05:00
Ed Page
ac64391910 refactor(parser): Remove dead code 2022-06-06 10:15:28 -05:00
Ed Page
9638f33d2f fix(parser): Exclusive shouldnt preclude defaults
Unsure why a comment said this doesn't matter.  It matters both for
counting arguments and for reporting the correct argument is exclusive.
2022-06-04 12:58:53 -05:00
Ed Page
f3bc3d5eb7 fix(error): Don't include default-but-required arguments in usage 2022-06-04 12:58:53 -05:00
Ed Page
5f56e93c0f refactor(parser): Clarify we are working with ids, not names 2022-06-04 12:58:53 -05:00
Ed Page
ccd6663de9 fix(help): Output some bool possible values
Originally I hid all, assuming the flag-only use case but we had to
prevent that from showing up anyways.  For the takes_value case, we
should be showing something since we know what it accepts.  I decided to
only show the most basic values and hide the rest so as to not overwhelm
the user with redundant options and hope the user recognizes they are
redundant.
2022-06-04 12:58:53 -05:00
Ed Page
a3092bafce fix(help): Don't report flag defaults
Now that flags can have meaningful defaults and with defaults being
implicitly set for certain actions, they appear in help but don't quite
make sense.
2022-06-04 12:58:53 -05:00
Ed Page
52e2874c03 fix(builder): Make it easier to discover/access ArgAction 2022-06-04 12:58:53 -05:00
Ed Page
e4b443d8bb fix(parser): Provide default value for Actions
Actions were inspired by Python and Python does not implicitly default
any field when an action is given.  From a Builder API perspective, this
seemed fine because we tend to focus the Builder API on giving the user
all information so they can make their own decisions.  When working on
the Derive API, this became a problem because users were going to have
to migrate from an implied default to an explicit default when a common
default is good enough most of the time.  This shouldn't interfere with
Builder users getting more details when needed.

This also highlighted two problems
- We set the index for defaults
- We don't debug_assert when applying conditional requirements with a
  default present
2022-06-03 10:02:35 -05:00
Ed Page
002d4421e5 Revert "fix(parser): Don't treat missing values as missing args"
This reverts commit 50f4018dcf.

This broke compatibility with the derive when dealing with
`Option<Option<T>>` and related cases.
2022-06-02 16:56:14 -05:00
Ed Page
50f4018dcf fix(parser): Don't treat missing values as missing args 2022-06-02 13:45:18 -05:00
Ed Page
cc2714beab fix(parser): Don't allow error equality
This could cause surprising results for users as we add fields
2022-06-02 13:36:05 -05:00
Ed Page
ab08a3069a docs(builder): Note the type for 'Count' 2022-06-01 16:23:19 -05:00
Ed Page
95c812b411 feat(builder): Set/Append Actions
This round out the new style actions and allow us to start deprecating
occurrences.

As part of an effort to unify code paths, this does change flag parsing
to do splits.  This will only be a problem if the user enables splits
but we'll at least not crash.  Once we also address #3776, we'll be able
to have envs all work the same.
2022-06-01 10:12:44 -05:00
Ed Page
c58a802a1d style: Make clippy happy 2022-06-01 06:45:23 -05:00
Ed Page
4afd1aafe5 fix(parser): Don't double-increment index on flags 2022-05-31 21:21:50 -05:00
Ed Page
06ea572770 fix(parser): Apply conditional defaults
Now that we can store constants for flags, we can apply defaults for
flags too.

Fixes #3294
2022-05-31 21:21:50 -05:00
Ed Page
67f47c5618 feat(parser): SetTrue/SetFalse/Count Actions
This is the minimum set of actions for the derive to move off of
`parse`.  These are inspired by Python's native actions.

These new actions have a "unified" behavior with defaults/envs.  This
mostly means that occurrences aren't tracked.  Occurrences were used as
a substitute for `ValueSource` or for counting values.  Both cases
shouldn't be needed anymore but we can re-evaluate this later if needed.
2022-05-31 21:21:48 -05:00
Ed Page
36680593be refactor(parser): Clarify intent of push_arg_values 2022-05-31 20:46:22 -05:00
Ed Page
7163f8d3e8 refactor(parser): Clarify intent of split_arg_values 2022-05-31 20:46:22 -05:00
Ed Page
e53dd937be feat(builder): Infer takes_vaue from action 2022-05-31 20:46:22 -05:00
Ed Page
91480de6d2 feat(builder): Expose ArgAction 2022-05-31 20:46:22 -05:00
Ed Page
b1b5820cb4 refactor(asserts): Ensure we always check positionals take values 2022-05-31 20:46:22 -05:00
Ed Page
2b95985161 refactor(parser): Ensure action and are are in-sync 2022-05-31 20:45:56 -05:00
Ed Page
7264bf28c7 refactor(parser): Clarify Action::Flag's behavior 2022-05-31 15:11:24 -05:00
Ed Page
eeca653697 refactor(parser): Loosen Action trait requirements 2022-05-31 15:10:07 -05:00
Ed Page
fb99d2c625 refactor(parser): Allow adding more actions in the future 2022-05-31 15:09:30 -05:00
Ed Page
8af7294a26 style: Make clippy happy 2022-05-31 14:50:56 -05:00
Ed Page
12d145c60d style: Fix debug typoe 2022-05-31 14:44:36 -05:00
Ed Page
70b633b0ea refactor(parser): Be explicit about not not iterating over every value 2022-05-31 14:44:36 -05:00
Ed Page
5a55f4a863 fix(parser): Restore positional occurrence behavior
This fixes a compatibility issue introduced in 9805fdad1b
2022-05-31 14:44:36 -05:00
Ed Page
c052a976b8 fix(parser): Qualify the type of action
My hope is to add group actions as well, so we need to qualify what kind
of action this is.
2022-05-31 14:22:24 -05:00
Ed Page
cb6f7b783a fix(parser): Restore interleaved positional behavior
If we felt this was important long-term, we should fix this outside of
the Action.  Since we might be changing up occurrences (#3772), we can
probably get away with a hack.
2022-05-31 14:15:57 -05:00
Ed Page
f2a219e77d refactor(parser)!: Switch flag values to Actions
This changes how occurrences and values are grouped for multiple values.
Today, it appears as a bug.  If we move forward with #3772, then this
can make sense.
2022-05-31 14:04:12 -05:00
Ed Page
bf7259d644 refactor(parser): Switch positionals to actions 2022-05-31 10:35:54 -05:00
Ed Page
6f5aaab443 refactor(parser): Allow more match-state 2022-05-27 20:10:53 -05:00
Ed Page
0b5de2198e refactor(parser): Don't track the actual identifier
When creating `PendingValues`, I can't have the lifetime.  I could make
it a `Cow` but decided to hold off instead since we don't need this
right now.  Maybe by the time we do need it, we'll have another way of
doing this.
2022-05-27 19:50:47 -05:00
Ed Page
2d8a15453e refactor(parser): Be more explicit that default missing values is not escaped 2022-05-27 19:40:49 -05:00
Ed Page
dc8a7d420e refactor(parser): Switch defaults/envs to actions
There is a default_missing_vals case which is slightly different because
its not actually a default but closing out the remaining argument that
was started in last iteration.
2022-05-27 19:34:19 -05:00
Ed Page
a98075e9cd refactor(parser); Switch default_missing_vals to actions 2022-05-27 19:07:28 -05:00
Ed Page
f0b2924f36 refactor(parser): Match default_missing_vals to rest 2022-05-27 19:06:23 -05:00
Ed Page
e1c5cba5f9 refactor(parser): Extract an occurrence into a reaction 2022-05-27 16:50:28 -05:00
Ed Page
b862fe227a refactor(parser): Generalize the performing of actions 2022-05-27 16:30:38 -05:00
Ed Page
7b6bb32985 refactor(parser): Separate delimiting from storing 2022-05-27 16:27:35 -05:00
Ed Page
e4271d09d9 refactor(parser): Normalize Arg variable names 2022-05-27 15:51:35 -05:00
Ed Page
e41a65d540 style: Fix typos 2022-05-27 13:56:38 -05:00
Ed Page
8f16f2ea41 refactor(parser): Clarify intent for defaults/envs
Especially important is not inferring intent from occurrences as
hopefully that will change with the introduction of actions.
2022-05-27 13:55:54 -05:00
Ed Page
2a409be7a5 refactor(parser): Clarify all ignored parse results 2022-05-27 13:15:34 -05:00
Ed Page
ac8320ddb2 refactor(parser): Make it more clear when we ignore parse results 2022-05-27 12:57:13 -05:00
Ed Page
9f4686714a fix(parser): Always end on required delimited arg
Before, if we were in trailing values that aren't delimite, we wouldn't
respect this flag and end processing of the value, now we do.

This also has a slight perf benefit of us only splitting the value if
the delimiter is present.  We checked for the delimiter anyways, so
doing it first removes a slight bit of work.

I also feel this helps clarify the intended behavior and ooches us
towards a unified code path for actions.
2022-05-27 10:31:10 -05:00
Ed Page
e268dbfbe9 refactor(parser): Clarify value consumption name 2022-05-27 09:23:21 -05:00
Ed Page
c72f03e53f refactor(parser): Be more explicit in default_missing_values
I wrote these tests expecting to highlight a bug but it turns out things
were structured just right to not exhibit it.  The fact that the code
looks like its broken is a problem, so I restructured it (put it first,
changed the source) so it doesn't look suspicious anymore.
2022-05-27 07:04:24 -05:00
Ed Page
302bf63678 fix(parser): Always use delimiter on defaults/env
Doesn't make sense to respect how the command line ended
2022-05-26 20:50:44 -05:00
Ed Page
ccc809a9df fix(parser): Allow delimiting default_missing_values
Fixes #3761
2022-05-26 20:36:49 -05:00
Ed Page
9805fdad1b refactor(parser)!: Consolidate group/occurrence logic
We were independently starting occurrences and starting value groups.
Now we do them at the same time.

COMPATIBILITY: This changes us from counting occurrences per positional
when using `multiple_values` to one occurrence.  This is user visible
and tests were written against it but it goes against the documentation
and doesn't quite make sense.
2022-05-26 19:30:29 -05:00
Ed Page
28cb71cddd fix(parser): Pass the intended flag to the action
Inferred flags can make it hard for a future action to trigger behavior
off of the selected alias, like we might want to do for negations, so we
are now translating to the intended arg.

This will also help for debugging.
2022-05-26 16:29:18 -05:00
Ed Page
868320097e refactor(parser): Consolidate help/version handling
This is a step towards user-visible actions
2022-05-26 15:55:48 -05:00
Ed Page
e8e5890f08 refactor(parser): Remove dead code 2022-05-26 09:44:55 -05:00
Ed Page
ae97550638 fix(validator): Deprecate validator_regex
Fixes #3743
2022-05-25 14:32:00 -05:00
Ed Page
fcdd31781b feat(parser): Allow people to plug into 'value_parser' macro
For most users, this won't be worth doing, they can just specify the
parser if needed.  Where this has value is crates that integrate custom
types into clap, like creating click-like file integration.  See
https://click.palletsprojects.com/en/8.0.x/arguments/#file-arguments
2022-05-25 14:12:27 -05:00
Ed Page
814d30b1de fix(parser): Deprecate is_valid_arg 2022-05-25 13:00:51 -05:00
Ed Page
a712adefcd fix(parser): Deprecate value_of and friends 2022-05-25 12:57:11 -05:00
Ed Page
256643f8d3 fix: Deprecate possible_values 2022-05-25 12:57:11 -05:00
Ed Page
573d496bc6 fix: Deprecate forbid_empty_values 2022-05-25 12:57:11 -05:00
Ed Page
177511dab1 fix: Deprecate validator / validator_os
`validator_regex` is being ignored for now as I await on a comment
period for #3743
2022-05-25 12:57:11 -05:00
Ed Page
f15a1aab1a fix: Deprecate allow_invalid_utf8 2022-05-25 12:57:11 -05:00
Ed Page
5b6d68f247 fix(parser): Show cause of panic in backtrace 2022-05-25 12:57:11 -05:00
Ed Page
9b5b49ceec fix(parser): Error, don't panicon on get_many type mismatch 2022-05-25 12:57:11 -05:00
Ed Page
a1df333ccd fix(parser): Improve panic messages for get_one, etc 2022-05-25 12:10:30 -05:00
Ed Page
bac68e5d30 docs(parser): Fix links 2022-05-25 11:00:46 -05:00