[commands] Separate view parsing errors from BadArgument.

This causes them to be raised from a new exception named
ArgumentParsingError with 3 children for ease with i18n. This is
technically a breaking change since it no longer derives from
BadArgument, though catching UserInputError will prevent this change
from affecting the user.
This commit is contained in:
Rapptz
2019-03-12 05:27:34 -04:00
parent 13b23963ec
commit 560783c3d2
3 changed files with 76 additions and 6 deletions

View File

@ -24,7 +24,7 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
"""
from .errors import BadArgument
from .errors import UnexpectedQuoteError, InvalidEndOfQuotedStringError, ExpectedClosingQuoteError
class StringView:
def __init__(self, buffer):
@ -151,7 +151,7 @@ def quoted_word(view):
if not current:
if is_quoted:
# unexpected EOF
raise BadArgument('Expected closing {}.'.format(close_quote))
raise ExpectedClosingQuoteError(close_quote)
return ''.join(result)
# currently we accept strings in the format of "hello world"
@ -162,7 +162,7 @@ def quoted_word(view):
# string ends with \ and no character after it
if is_quoted:
# if we're quoted then we're expecting a closing quote
raise BadArgument('Expected closing {}.'.format(close_quote))
raise ExpectedClosingQuoteError(close_quote)
# if we aren't then we just let it through
return ''.join(result)
@ -177,14 +177,14 @@ def quoted_word(view):
if not is_quoted and current in _all_quotes:
# we aren't quoted
raise BadArgument('Unexpected quote mark in non-quoted string')
raise UnexpectedQuoteError(current)
# closing quote
if is_quoted and current == close_quote:
next_char = view.get()
valid_eof = not next_char or next_char.isspace()
if not valid_eof:
raise BadArgument('Expected space after closing quotation')
raise InvalidEndOfQuotedStringError(next_char)
# we're quoted so it's okay
return ''.join(result)