"""Possible Exceptions that are returned by the Szurubooru REST API We define the general Exception `SzurubooruException` and possible child exceptions defined in this module as well as the Szurubooru API docs: https://github.com/rr-/szurubooru/blob/master/doc/API.md#error-handling """ import json import requests as r class SzurubooruException(Exception): """General Error returned from the Szurubooru REST API. The Szurubooru API returns errors together with an http code in a form like this: .. code-block:: JSON { "name": "Name of the error, e.g. 'PostNotFoundError'", "title": "Generic title of error message, e.g. 'Not found'", "description": "Detailed description of what went wrong, e.g. 'User `rr-` not found." } We map this json response to the SzurubooruException class or more specific children such as MissingRequiredFileError with the fields / args that are provided from the json response. Args: name: Name of the exception as defined by the Szurubooru REST API The name is also used in more specific Exceptions such as MissingRequiredFileError(SzurubooruException). title: Generic, human readable title of the error message. description: More detailed description of what went wrong. Often includes input from the user that caused the error. """ name: str title: str description: str def __init__(self, name: str, title: str, description: str) -> None: self.name = name self.title = title self.description = description super().__init__(description) @staticmethod def response_is_exception(res: r.Response) -> bool: """Check if the Szurubooru REST API response is an error or not. Args: res (r.Response): the Response of the request from the requests module. Returns: bool: True if response is an error and False if it is not. """ return res.status_code != 200 @staticmethod def map_exception(res: r.Response) -> Exception: """Generate an exception for an error response from the Szurubooru REST API. Args: res (r.Response): the Response from the Szurubooru REST API that should be mapped to a Python Exception. Raises: LookupError: Thrown when the Szurubooru REST API sent an error type (name) that could not be mapped to one of the SzurubooruException Python Exceptions. This can happen when there was an unexpected e.g. an Internal Server Error in the Szurubooru REST API. Returns: Exception: Returns a more specific exception. """ content: dict[str, str] = json.loads(res.content) name: str = content["name"] title: str = content["title"] description: str = content["description"] match name: case "MissingRequiredFileError": return MissingRequiredFileError(name, title, description) case "MissingRequiredParameterError": return MissingRequiredParameterError(name, title, description) case "InvalidParameterError": return InvalidParameterError(name, title, description) case "IntegrityError": return IntegrityError(name, title, description) case "SearchError": return SearchError(name, title, description) case "AuthError": return AuthError(name, title, description) case "PostNotFoundError": return PostNotFoundError(name, title, description) case "PostAlreadyFeaturedError": return PostAlreadyFeaturedError(name, title, description) case "PostAlreadyUploadedError": return PostAlreadyUploadedError(name, title, description) case "InvalidPostIdError": return InvalidPostIdError(name, title, description) case "InvalidPostSafetyError": return InvalidPostSafetyError(name, title, description) case "InvalidPostSourceError": return InvalidPostSourceError(name, title, description) case "InvalidPostContentError": return InvalidPostContentError(name, title, description) case "InvalidPostRelationError": return InvalidPostRelationError(name, title, description) case "InvalidPostNoteError": return InvalidPostNoteError(name, title, description) case "InvalidPostFlagError": return InvalidPostFlagError(name, title, description) case "InvalidFavoriteTargetError": return InvalidFavoriteTargetError(name, title, description) case "InvalidCommentIdError": return InvalidCommentIdError(name, title, description) case "CommentNotFoundError": return CommentNotFoundError(name, title, description) case "EmptyCommentTextError": return EmptyCommentTextError(name, title, description) case "InvalidScoreTargetError": return InvalidScoreTargetError(name, title, description) case "InvalidScoreValueError": return InvalidScoreValueError(name, title, description) case "TagCategoryNotFoundError": return TagCategoryNotFoundError(name, title, description) case "TagCategoryAlreadyExistsError": return TagCategoryAlreadyExistsError(name, title, description) case "TagCategoryIsInUseError": return TagCategoryIsInUseError(name, title, description) case "InvalidTagCategoryNameError": return InvalidTagCategoryNameError(name, title, description) case "InvalidTagCategoryColorError": return InvalidTagCategoryColorError(name, title, description) case "TagNotFoundError": return TagNotFoundError(name, title, description) case "TagAlreadyExistsError": return TagAlreadyExistsError(name, title, description) case "TagIsInUseError": return TagIsInUseError(name, title, description) case "InvalidTagNameError": return InvalidTagNameError(name, title, description) case "InvalidTagRelationError": return InvalidTagRelationError(name, title, description) case "InvalidTagCategoryError": return InvalidTagCategoryError(name, title, description) case "InvalidTagDescriptionError": return InvalidTagDescriptionError(name, title, description) case "UserNotFoundError": return UserNotFoundError(name, title, description) case "UserAlreadyExistsError": return UserAlreadyExistsError(name, title, description) case "InvalidUserNameError": return InvalidUserNameError(name, title, description) case "InvalidEmailError": return InvalidEmailError(name, title, description) case "InvalidPasswordError": return InvalidPasswordError(name, title, description) case "InvalidRankError": return InvalidRankError(name, title, description) case "InvalidAvatarError": return InvalidAvatarError(name, title, description) case "ProcessingError": return ProcessingError(name, title, description) case "ValidationError": return ValidationError(name, title, description) case _: raise LookupError(f'Unknown SzurubooruException: "{name}"') class MissingRequiredFileError(SzurubooruException): # noqa: D101 pass class MissingRequiredParameterError(SzurubooruException): # noqa: D101 pass class InvalidParameterError(SzurubooruException): # noqa: D101 pass class IntegrityError(SzurubooruException): # noqa: D101 pass class SearchError(SzurubooruException): # noqa: D101 pass class AuthError(SzurubooruException): # noqa: D101 pass class PostNotFoundError(SzurubooruException): # noqa: D101 pass class PostAlreadyFeaturedError(SzurubooruException): # noqa: D101 pass class PostAlreadyUploadedError(SzurubooruException): # noqa: D101 pass class InvalidPostIdError(SzurubooruException): # noqa: D101 pass class InvalidPostSafetyError(SzurubooruException): # noqa: D101 pass class InvalidPostSourceError(SzurubooruException): # noqa: D101 pass class InvalidPostContentError(SzurubooruException): # noqa: D101 pass class InvalidPostRelationError(SzurubooruException): # noqa: D101 pass class InvalidPostNoteError(SzurubooruException): # noqa: D101 pass class InvalidPostFlagError(SzurubooruException): # noqa: D101 pass class InvalidFavoriteTargetError(SzurubooruException): # noqa: D101 pass class InvalidCommentIdError(SzurubooruException): # noqa: D101 pass class CommentNotFoundError(SzurubooruException): # noqa: D101 pass class EmptyCommentTextError(SzurubooruException): # noqa: D101 pass class InvalidScoreTargetError(SzurubooruException): # noqa: D101 pass class InvalidScoreValueError(SzurubooruException): # noqa: D101 pass class TagCategoryNotFoundError(SzurubooruException): # noqa: D101 pass class TagCategoryAlreadyExistsError(SzurubooruException): # noqa: D101 pass class TagCategoryIsInUseError(SzurubooruException): # noqa: D101 pass class InvalidTagCategoryNameError(SzurubooruException): # noqa: D101 pass class InvalidTagCategoryColorError(SzurubooruException): # noqa: D101 pass class TagNotFoundError(SzurubooruException): # noqa: D101 pass class TagAlreadyExistsError(SzurubooruException): # noqa: D101 pass class TagIsInUseError(SzurubooruException): # noqa: D101 pass class InvalidTagNameError(SzurubooruException): # noqa: D101 pass class InvalidTagRelationError(SzurubooruException): # noqa: D101 pass class InvalidTagCategoryError(SzurubooruException): # noqa: D101 pass class InvalidTagDescriptionError(SzurubooruException): # noqa: D101 pass class UserNotFoundError(SzurubooruException): # noqa: D101 pass class UserAlreadyExistsError(SzurubooruException): # noqa: D101 pass class InvalidUserNameError(SzurubooruException): # noqa: D101 pass class InvalidEmailError(SzurubooruException): # noqa: D101 pass class InvalidPasswordError(SzurubooruException): # noqa: D101 pass class InvalidRankError(SzurubooruException): # noqa: D101 pass class InvalidAvatarError(SzurubooruException): # noqa: D101 pass class ProcessingError(SzurubooruException): # noqa: D101 pass class ValidationError(SzurubooruException): # noqa: D101 pass