blob: 41dbf8bee1415c533fd25187159a01fa56dc7926 [file]
# Copyright 2026 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from typing import Literal
from pydantic import Field
from pydap.dap_types import DapBaseModel, Thread
from pydap.models import (
Event,
PauseArguments,
ThreadEvent,
ThreadEventBody,
ThreadsResponse,
ThreadsResponseBody,
)
class ZxdbPauseArguments(PauseArguments):
"""Arguments for `pause` request with zxdb extensions.
Attributes:
process_id: Optional process ID to pause.
"""
# We have to explicitly override thread_id: int = Field(default=0) on
# ZxdbPauseArguments because Pydantic v2 inherits field requiredness
# from the parent class when not overridden.
thread_id: int = Field(default=0)
process_id: int
class ZxdbProcessStoppedEventBody(DapBaseModel):
"""Body of the `processStopped` event.
Attributes:
process_id: Process ID (KOID).
name: Process name.
threads: List of thread IDs (KOIDs) stopped in the process.
"""
process_id: int
name: str | None = None
threads: list[int] = Field(default_factory=list)
class ZxdbProcessStoppedEvent(Event):
"""Zxdb-specific processStopped event."""
type: Literal["event"] = "event"
event: Literal["processStopped"] = "processStopped"
body: ZxdbProcessStoppedEventBody
class ZxdbThread(Thread):
"""Zxdb-specific thread model containing processId."""
process_id: int | None = None
class ZxdbThreadsResponseBody(ThreadsResponseBody):
"""Body of response to `threads` request containing zxdb threads."""
threads: list[ZxdbThread]
class ZxdbThreadsResponse(ThreadsResponse):
"""Response to `threads` request with zxdb specific thread info."""
body: ZxdbThreadsResponseBody
class ZxdbThreadEventBody(ThreadEventBody):
"""Body of the thread event containing optional processId."""
process_id: int | None = None
class ZxdbThreadEvent(ThreadEvent):
"""Zxdb-specific thread event with processId in body."""
body: ZxdbThreadEventBody
class AsyncTaskNode(DapBaseModel):
"""Represents a node in the async task tree."""
id: str | None = None
name: str | None = None
file: str | None = None
line: int | None = None
children: list["AsyncTaskNode"] = Field(default_factory=list)
class AsyncBacktraceUpdateBody(DapBaseModel):
"""Body of zxdb.updateAsyncBacktrace event.
Attributes:
thread_id: Thread KOID (aliased as 'id' in DAP wire protocol).
name: Name of the thread.
process_id: Process KOID.
tasks: Root list of async task nodes.
"""
thread_id: int = Field(alias="id")
name: str | None = None
process_id: int
tasks: list[AsyncTaskNode] = Field(default_factory=list)
class AsyncBacktraceUpdate(Event):
"""Custom event for asynchronous backtrace updates."""
type: Literal["event"] = "event"
event: Literal["zxdb.updateAsyncBacktrace"] = "zxdb.updateAsyncBacktrace"
body: AsyncBacktraceUpdateBody
AsyncTaskNode.model_rebuild()