from typing import Optional from src.constants import Client class BaseError(Exception): def __init__(self, message: str, source: str): self.message = message self.source = source def __str__(self): return f"{self.source}: {self.message}" def __repr__(self): return str(self) class BaseReasonError(Exception): def __init__(self, message: str, source: str, reason: Optional[str] = None): if reason: message = f"{message}: {reason}" super().__init__(message, source) class SnowflakeNotFinishedError(BaseReasonError): def __init__(self, reason: Optional[str] = None): super().__init__("Query is still running", Client.SNOWFLAKE, reason) class SnowflakeError(BaseError): def __init__(self, status): super().__init__(f"Query failed with status {status}", Client.SNOWFLAKE) class MySQLNotFinishedError(BaseError): def __init__(self): super().__init__("Query is still running", Client.MYSQL) class MySQLError(BaseReasonError): def __init__(self, reason: Optional[str] = None): super().__init__("MySQL query failed", Client.MYSQL, reason) class S3Error(BaseError): def __init__(self, error: Exception): super().__init__(str(error), Client.S3)