ForcePilot/backend/package/yuxi/channels/contract/dtos/lifecycle.py

79 lines
2.7 KiB
Python
Raw Normal View History

"""生命周期 DTO。
定义插件生命周期端口的命令与结果值对象包括生命周期命令与生命周期结果
所有 DTO 均为 ``dataclass(frozen=True)``仅依赖标准库用于插件的加载
启动暂停恢复停止卸载重载等生命周期操作的命令传递与结果返回
"""
from __future__ import annotations
from dataclasses import dataclass
from typing import Any, Literal
from yuxi.channels.contract.errors import ValidationError
@dataclass(frozen=True)
class LifecycleCmd:
"""生命周期命令PLG-001
由生命周期端口方法引用描述一次插件生命周期操作请求携带事件类型
插件 ID 与操作参数事件类型覆盖 load / start / pause / resume / stop /
unload / reload 等场景
字段
event: 生命周期事件load | start | pause | resume | stop | unload | reload
plugin_id: 插件 ID
params: 操作参数可选
"""
event: Literal["load", "start", "pause", "resume", "stop", "unload", "reload"]
plugin_id: str
params: dict[str, Any] | None = None
def __post_init__(self) -> None:
"""校验必填字段非空与事件取值。
``plugin_id`` 必须非空``event`` 必须为 ``load`` / ``start`` /
``pause`` / ``resume`` / ``stop`` / ``unload`` / ``reload`` 之一
在构造时即抛出 ``ValidationError``adapter 不再做该校验INV-8
"""
if not self.plugin_id:
raise ValidationError("plugin_id", "must not be empty")
if self.event not in (
"load",
"start",
"pause",
"resume",
"stop",
"unload",
"reload",
):
raise ValidationError(
"event",
"must be one of: load, start, pause, resume, stop, unload, reload",
)
@dataclass(frozen=True)
class LifecycleResult:
"""生命周期结果PLG-001
描述插件生命周期操作的执行结果携带状态与错误信息用于结果汇报与
异常归因状态覆盖 discovered / resolved / loaded / initialized / started /
paused / stopped / unloaded / failed 等场景
字段
state: 生命周期状态
error: 错误信息可选
error_code: 错误码用例服务捕获异常时填充默认空字符串
trace_id: 追踪 ID用例服务捕获异常时填充默认空字符串
"""
state: Literal[
"discovered", "resolved", "loaded", "initialized", "started", "paused", "stopped", "unloaded", "failed"
]
error: str | None = None
error_code: str = ""
trace_id: str = ""