40 lines
1.3 KiB
Python
40 lines
1.3 KiB
Python
"""Helper class to convert between Home Assistant and ESPHome enum values."""
|
|
|
|
from typing import Generic, TypeVar, overload
|
|
|
|
from aioesphomeapi import APIIntEnum
|
|
|
|
_EnumT = TypeVar("_EnumT", bound=APIIntEnum)
|
|
_ValT = TypeVar("_ValT")
|
|
|
|
|
|
class EsphomeEnumMapper(Generic[_EnumT, _ValT]):
|
|
"""Helper class to convert between hass and esphome enum values."""
|
|
|
|
def __init__(self, mapping: dict[_EnumT, _ValT]) -> None:
|
|
"""Construct a EsphomeEnumMapper."""
|
|
# Add none mapping
|
|
augmented_mapping: dict[
|
|
_EnumT | None, _ValT | None
|
|
] = mapping # type: ignore[assignment]
|
|
augmented_mapping[None] = None
|
|
|
|
self._mapping = augmented_mapping
|
|
self._inverse: dict[_ValT, _EnumT] = {v: k for k, v in mapping.items()}
|
|
|
|
@overload
|
|
def from_esphome(self, value: _EnumT) -> _ValT:
|
|
...
|
|
|
|
@overload
|
|
def from_esphome(self, value: _EnumT | None) -> _ValT | None:
|
|
...
|
|
|
|
def from_esphome(self, value: _EnumT | None) -> _ValT | None:
|
|
"""Convert from an esphome int representation to a hass string."""
|
|
return self._mapping[value]
|
|
|
|
def from_hass(self, value: _ValT) -> _EnumT:
|
|
"""Convert from a hass string to a esphome int representation."""
|
|
return self._inverse[value]
|