"""
Вспомогательные методы для обработки исключений
"""
from typing import Callable

from typing_extensions import Coroutine

from infrastructure.logger.presenter import logger


class ExceptionHandler:
    """
    Обработчик исключений
    """

    def __init__(self, ex_handler_map: dict[type[Exception], Callable | Coroutine | None]):
        self.ex_handler_map = ex_handler_map

    def __call__(self, func: Callable | Coroutine):
        self.func = func

        return self.wrapper

    async def wrapper(self, *args, **kwargs):
        """
        Обертка
        """
        try:
            await self.func(*args, **kwargs)
        except Exception as exception:
            handler = self.ex_handler_map.get(exception.__class__, None)
            logger.info(f"Обработано исключение {exception}. Передаю обработку обработчику {handler}.")

            if handler:
                await handler(exception, *args, **kwargs)
