from __future__ import annotations import uuid from dataclasses import dataclass, field from yuxi.channel.domain.model.message.unified_message import UnifiedMessage @dataclass class Span: middleware_name: str started_at: float = 0.0 finished_at: float = 0.0 duration_ms: float = 0.0 aborted: bool = False skipped: bool = False @dataclass class MessageContext: message: UnifiedMessage channel_type: str = "" trace_id: str = field(default_factory=lambda: str(uuid.uuid4())) spans: list[Span] = field(default_factory=list) aborted: bool = field(default=False, init=False, repr=False) skipped: bool = field(default=False, init=False, repr=False) abort_reason: str = field(default="", init=False, repr=False) abort_code: str = field(default="", init=False, repr=False) @property def is_aborted(self) -> bool: return self.aborted @property def is_skipped(self) -> bool: return self.skipped def abort(self, reason: str, code: str = "") -> None: self.aborted = True self.abort_reason = reason self.abort_code = code def skip(self) -> None: self.skipped = True