203 lines
5.1 KiB
Python
203 lines
5.1 KiB
Python
|
|
class TOMLKitError(Exception):
|
|
|
|
pass
|
|
|
|
|
|
class ParseError(ValueError, TOMLKitError):
|
|
"""
|
|
This error occurs when the parser encounters a syntax error
|
|
in the TOML being parsed. The error references the line and
|
|
location within the line where the error was encountered.
|
|
"""
|
|
|
|
def __init__(
|
|
self, line, col, message=None
|
|
): # type: (int, int, Optional[str]) -> None
|
|
self._line = line
|
|
self._col = col
|
|
|
|
if message is None:
|
|
message = "TOML parse error"
|
|
|
|
super(ParseError, self).__init__(
|
|
"{} at line {} col {}".format(message, self._line, self._col)
|
|
)
|
|
|
|
@property
|
|
def line(self):
|
|
return self._line
|
|
|
|
@property
|
|
def col(self):
|
|
return self._col
|
|
|
|
|
|
class MixedArrayTypesError(ParseError):
|
|
"""
|
|
An array was found that had two or more element types.
|
|
"""
|
|
|
|
def __init__(self, line, col): # type: (int, int) -> None
|
|
message = "Mixed types found in array"
|
|
|
|
super(MixedArrayTypesError, self).__init__(line, col, message=message)
|
|
|
|
|
|
class InvalidNumberError(ParseError):
|
|
"""
|
|
A numeric field was improperly specified.
|
|
"""
|
|
|
|
def __init__(self, line, col): # type: (int, int) -> None
|
|
message = "Invalid number"
|
|
|
|
super(InvalidNumberError, self).__init__(line, col, message=message)
|
|
|
|
|
|
class InvalidDateTimeError(ParseError):
|
|
"""
|
|
A datetime field was improperly specified.
|
|
"""
|
|
|
|
def __init__(self, line, col): # type: (int, int) -> None
|
|
message = "Invalid datetime"
|
|
|
|
super(InvalidDateTimeError, self).__init__(line, col, message=message)
|
|
|
|
|
|
class InvalidDateError(ParseError):
|
|
"""
|
|
A date field was improperly specified.
|
|
"""
|
|
|
|
def __init__(self, line, col): # type: (int, int) -> None
|
|
message = "Invalid date"
|
|
|
|
super(InvalidDateError, self).__init__(line, col, message=message)
|
|
|
|
|
|
class InvalidTimeError(ParseError):
|
|
"""
|
|
A date field was improperly specified.
|
|
"""
|
|
|
|
def __init__(self, line, col): # type: (int, int) -> None
|
|
message = "Invalid time"
|
|
|
|
super(InvalidTimeError, self).__init__(line, col, message=message)
|
|
|
|
|
|
class InvalidNumberOrDateError(ParseError):
|
|
"""
|
|
A numeric or date field was improperly specified.
|
|
"""
|
|
|
|
def __init__(self, line, col): # type: (int, int) -> None
|
|
message = "Invalid number or date format"
|
|
|
|
super(InvalidNumberOrDateError, self).__init__(line, col, message=message)
|
|
|
|
|
|
class InvalidUnicodeValueError(ParseError):
|
|
"""
|
|
A unicode code was improperly specified.
|
|
"""
|
|
|
|
def __init__(self, line, col): # type: (int, int) -> None
|
|
message = "Invalid unicode value"
|
|
|
|
super(InvalidUnicodeValueError, self).__init__(line, col, message=message)
|
|
|
|
|
|
class UnexpectedCharError(ParseError):
|
|
"""
|
|
An unexpected character was found during parsing.
|
|
"""
|
|
|
|
def __init__(self, line, col, char): # type: (int, int, str) -> None
|
|
message = "Unexpected character: {}".format(repr(char))
|
|
|
|
super(UnexpectedCharError, self).__init__(line, col, message=message)
|
|
|
|
|
|
class EmptyKeyError(ParseError):
|
|
"""
|
|
An empty key was found during parsing.
|
|
"""
|
|
|
|
def __init__(self, line, col): # type: (int, int) -> None
|
|
message = "Empty key"
|
|
|
|
super(EmptyKeyError, self).__init__(line, col, message=message)
|
|
|
|
|
|
class EmptyTableNameError(ParseError):
|
|
"""
|
|
An empty table name was found during parsing.
|
|
"""
|
|
|
|
def __init__(self, line, col): # type: (int, int) -> None
|
|
message = "Empty table name"
|
|
|
|
super(EmptyTableNameError, self).__init__(line, col, message=message)
|
|
|
|
|
|
class InvalidCharInStringError(ParseError):
|
|
"""
|
|
The string being parsed contains an invalid character.
|
|
"""
|
|
|
|
def __init__(self, line, col, char): # type: (int, int, str) -> None
|
|
message = "Invalid character {} in string".format(repr(char))
|
|
|
|
super(InvalidCharInStringError, self).__init__(line, col, message=message)
|
|
|
|
|
|
class UnexpectedEofError(ParseError):
|
|
"""
|
|
The TOML being parsed ended before the end of a statement.
|
|
"""
|
|
|
|
def __init__(self, line, col): # type: (int, int) -> None
|
|
message = "Unexpected end of file"
|
|
|
|
super(UnexpectedEofError, self).__init__(line, col, message=message)
|
|
|
|
|
|
class InternalParserError(ParseError):
|
|
"""
|
|
An error that indicates a bug in the parser.
|
|
"""
|
|
|
|
def __init__(
|
|
self, line, col, message=None
|
|
): # type: (int, int, Optional[str]) -> None
|
|
msg = "Internal parser error"
|
|
if message:
|
|
msg += " ({})".format(message)
|
|
|
|
super(InternalParserError, self).__init__(line, col, message=msg)
|
|
|
|
|
|
class NonExistentKey(KeyError, TOMLKitError):
|
|
"""
|
|
A non-existent key was used.
|
|
"""
|
|
|
|
def __init__(self, key):
|
|
message = 'Key "{}" does not exist.'.format(key)
|
|
|
|
super(NonExistentKey, self).__init__(message)
|
|
|
|
|
|
class KeyAlreadyPresent(TOMLKitError):
|
|
"""
|
|
An already present key was used.
|
|
"""
|
|
|
|
def __init__(self, key):
|
|
message = 'Key "{}" already exists.'.format(key)
|
|
|
|
super(KeyAlreadyPresent, self).__init__(message)
|