feat: базовый класс BaseEvent с универсальным методом to_payload для гарантированного преобразования всех данных в строки
This commit is contained in:
@@ -0,0 +1,22 @@
|
|||||||
|
from dataclasses import asdict, dataclass, is_dataclass
|
||||||
|
from enum import StrEnum
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
def _factory(d: list[tuple[str, Any]]) -> dict[str, Any]:
|
||||||
|
def _convert(obj: Any) -> Any:
|
||||||
|
if isinstance(obj, StrEnum):
|
||||||
|
return obj.value
|
||||||
|
if isinstance(obj, list | tuple):
|
||||||
|
return [_convert(item) for item in obj]
|
||||||
|
if isinstance(obj, dict):
|
||||||
|
return {k: _convert(v) for k, v in obj.items()}
|
||||||
|
return obj
|
||||||
|
|
||||||
|
return {k: _convert(v) for k, v in d}
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass(frozen=True)
|
||||||
|
class BaseEvent:
|
||||||
|
def to_payload(self) -> dict[str, Any]:
|
||||||
|
return asdict(self, dict_factory=_factory)
|
||||||
Reference in New Issue
Block a user