from typing import Optional class MemeGeneratorException(Exception): status_code: int = 520 def __init__(self, message: str): self.message = message def __str__(self) -> str: return self.__repr__() def __repr__(self) -> str: return f"Error in meme_generator: {self.message}" class NoSuchMeme(MemeGeneratorException): status_code: int = 531 def __init__(self, meme_key: str): self.meme_key = meme_key message = f'No such meme with key="{self.meme_key}"' super().__init__(message) class TextOverLength(MemeGeneratorException): status_code: int = 532 def __init__(self, text: str): self.text = text message = f'Text "{self.text}" is too long!' super().__init__(message) class OpenImageFailed(MemeGeneratorException): status_code: int = 533 def __init__(self, error_message: str): self.error_message = error_message message = f'Error opening images: "{self.error_message}"' super().__init__(message) class ParserExit(MemeGeneratorException): status_code: int = 534 def __init__(self, status: int = 0, error_message: Optional[str] = None): self.status = status self.error_message = error_message or "" message = ( f"Argument parser failed to parse. (status={self.status}" + (f", message={self.error_message!r}" if self.error_message else "") + ")" ) super().__init__(message) class ParamsMismatch(MemeGeneratorException): status_code: int = 540 def __init__(self, meme_key: str, message: str): self.meme_key = meme_key self.message = message def __repr__(self) -> str: return f'ParamsMismatch(key="{self.meme_key}", message="{self.message}")' class ImageNumberMismatch(ParamsMismatch): status_code: int = 541 def __init__(self, meme_key: str, min_images: int = 0, max_images: int = 0): message = ( "The number of images is incorrect, " f"it should be no less than {min_images} and no more than {max_images}" ) super().__init__(meme_key, message) class TextNumberMismatch(ParamsMismatch): status_code: int = 542 def __init__(self, meme_key: str, min_texts: int = 0, max_texts: int = 0): message = ( "The number of texts is incorrect, " f"it should be no less than {min_texts} and no more than {max_texts}" ) super().__init__(meme_key, message) class TextOrNameNotEnough(ParamsMismatch): status_code: int = 543 def __init__(self, meme_key: str, message: Optional[str] = None): message = message or "The number of texts or user names is not enough" super().__init__(meme_key, message) class ArgMismatch(ParamsMismatch): status_code: int = 550 pass class ArgParserExit(ArgMismatch): status_code: int = 551 def __init__(self, meme_key: str, error_message: str): self.error_message = error_message message = f"Argument parser failed to parse: {self.error_message}" super().__init__(meme_key, message) class ArgModelMismatch(ArgMismatch): status_code: int = 552 def __init__(self, meme_key: str, error_message: str): self.error_message = error_message message = f"Argument model validation failed: {self.error_message}" super().__init__(meme_key, message)