blob: a57f510d1a1492f81ecd0a03ea31400e7e2082f5 [file] [edit]
# 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 Any
from pydantic import BaseModel, ConfigDict
PROTOCOL_VERSION = 4
class BaseRequest(BaseModel):
"""Base class for all requests, enforcing keyword-only instantiation."""
model_config = ConfigDict(kw_only=True)
command: str
last_seen_seq: int | None = None
ack_seq: int | None = None
class ThreadInfo(BaseModel):
"""Information about a single thread."""
id: int
name: str
class GetStateResponse(BaseModel):
"""Response for get-state command containing thread list and active
processes.
"""
threads: list[ThreadInfo]
processes: dict[int, str] | None = None
class Response(BaseModel):
"""Standard response wrapper."""
success: bool
message: str | None = None
body: GetStateResponse | dict[str, Any] | None = None
events: list[dict[str, Any]] | None = None
class ProtocolRegistry:
request_adapter: Any = None
def serialize(obj: BaseModel) -> str:
return obj.model_dump_json() + "\n"
def make_request(data: dict[str, Any]) -> BaseRequest:
if ProtocolRegistry.request_adapter is None:
raise RuntimeError("ProtocolRegistry not initialized")
return ProtocolRegistry.request_adapter.validate_python(data)
def deserialize_request(line: str) -> BaseRequest:
if ProtocolRegistry.request_adapter is None:
raise RuntimeError("ProtocolRegistry not initialized")
return ProtocolRegistry.request_adapter.validate_json(line.strip())
def get_schema() -> dict[str, Any]:
if ProtocolRegistry.request_adapter is None:
raise RuntimeError("ProtocolRegistry not initialized")
return {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "zxdb-cli Protocol Schema",
"description": (
"JSON schema for requests and responses in the "
"zxdb-cli UDS protocol"
),
"version": PROTOCOL_VERSION,
"requests": ProtocolRegistry.request_adapter.json_schema(),
"responses": Response.model_json_schema(),
}