diff options
| author | Rapptz <[email protected]> | 2018-09-23 06:12:26 -0400 |
|---|---|---|
| committer | Rapptz <[email protected]> | 2018-09-23 06:12:26 -0400 |
| commit | 00a445310b796ad0a8325b9eb7c01cbf1f4b61dc (patch) | |
| tree | 3d7a07781a48df5a123b0636ff61b442e4ba12c1 | |
| parent | [commands] Properly parse bool when inside a typing.Union (diff) | |
| download | discord.py-00a445310b796ad0a8325b9eb7c01cbf1f4b61dc.tar.xz discord.py-00a445310b796ad0a8325b9eb7c01cbf1f4b61dc.zip | |
[commands] Allow for backtracking parsing with typing.Optional
Original code by zephyrkul.
This new parsing mode allows for backtracking in case of failure
when a typing.Union[..., NoneType] or a typing.Optional[...] is used.
This means that if a type would fail to parse, the view is undo'd to
a previous state, passing the default parameter to the callback, and
then continuing on the next parameter as if nothing had happened.
| -rw-r--r-- | discord/ext/commands/core.py | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/discord/ext/commands/core.py b/discord/ext/commands/core.py index e11642ca..c64aeb9a 100644 --- a/discord/ext/commands/core.py +++ b/discord/ext/commands/core.py @@ -281,7 +281,15 @@ class Command: else: if origin is typing.Union: errors = [] + _NoneType = type(None) for conv in converter.__args__: + # if we got to this part in the code, then the previous conversions have failed + # so we should just undo the view, return the default, and allow parsing to continue + # with the other parameters + if conv is _NoneType and param.kind != param.VAR_POSITIONAL: + ctx.view.undo() + return None if param.default is param.empty else param.default + try: value = await self._actual_conversion(ctx, conv, argument, param) except CommandError as e: @@ -317,10 +325,12 @@ class Command: raise MissingRequiredArgument(param) return param.default + previous = view.index if consume_rest_is_special: argument = view.read_rest().strip() else: argument = quoted_word(view) + view.previous = previous return (await self.do_conversion(ctx, converter, argument, param)) |