diff --git a/src/mind_reader/state_machines/base_event.py b/src/mind_reader/state_machines/base_event.py new file mode 100644 index 0000000..aedf931 --- /dev/null +++ b/src/mind_reader/state_machines/base_event.py @@ -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)