core/homeassistant/components/homewizard/helpers.py

39 lines
1.3 KiB
Python

"""Helpers for HomeWizard."""
from __future__ import annotations
from collections.abc import Callable, Coroutine
from typing import Any, Concatenate, ParamSpec, TypeVar
from homewizard_energy.errors import DisabledError, RequestError
from homeassistant.exceptions import HomeAssistantError
from .entity import HomeWizardEntity
_HomeWizardEntityT = TypeVar("_HomeWizardEntityT", bound=HomeWizardEntity)
_P = ParamSpec("_P")
def homewizard_exception_handler(
func: Callable[Concatenate[_HomeWizardEntityT, _P], Coroutine[Any, Any, Any]]
) -> Callable[Concatenate[_HomeWizardEntityT, _P], Coroutine[Any, Any, None]]:
"""Decorate HomeWizard Energy calls to handle HomeWizardEnergy exceptions.
A decorator that wraps the passed in function, catches HomeWizardEnergy errors,
and reloads the integration when the API was disabled so the reauth flow is
triggered.
"""
async def handler(
self: _HomeWizardEntityT, *args: _P.args, **kwargs: _P.kwargs
) -> None:
try:
await func(self, *args, **kwargs)
except RequestError as ex:
raise HomeAssistantError from ex
except DisabledError as ex:
await self.hass.config_entries.async_reload(self.coordinator.entry.entry_id)
raise HomeAssistantError from ex
return handler