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