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

93 lines
3.0 KiB
Python
Raw Normal View History

"""配置校验 DTO。
定义渠道插件配置校验的不可变值对象包括配置校验错误项警告项与校验
结果所有 DTO 均为 ``dataclass(frozen=True)``仅依赖标准库用于
``WizardAdapter.runWizardStep``安装时 ``DoctorAdapter.runItem``
运行时的配置校验流程PRD §4.0.4 核心方法 2配置校验
"""
from __future__ import annotations
from dataclasses import dataclass
from yuxi.channels.contract.errors import ValidationError
@dataclass(frozen=True)
class ConfigError:
"""配置校验错误项。
描述单项配置校验错误包括字段路径错误消息与错误码用于配置校验
结果的错误详情
字段
field_path: 字段路径 "credentials.app_id"
message: 错误消息
error_code: 错误码 "missing_field" / "invalid_format"
"""
field_path: str
message: str
error_code: str
def __post_init__(self) -> None:
"""校验 field_path / message / error_code 非空。
必填字符串字段必须非空在构造时即抛出 ``ValidationError``避免
空字段路径或空错误码导致校验错误项无法定位与分类INV-8
"""
if not self.field_path:
raise ValidationError("field_path", "must not be empty")
if not self.message:
raise ValidationError("message", "must not be empty")
if not self.error_code:
raise ValidationError("error_code", "must not be empty")
@dataclass(frozen=True)
class ConfigWarning:
"""配置校验警告项。
描述单项配置校验警告包括字段路径与警告消息用于配置校验结果的
警告详情
字段
field_path: 字段路径
message: 警告消息
"""
field_path: str
message: str
def __post_init__(self) -> None:
"""校验 field_path 与 message 非空。
``field_path`` ``message`` 必须非空在构造时即抛出
``ValidationError``避免空字段路径或空消息导致警告项无法定位与
展示INV-8
"""
if not self.field_path:
raise ValidationError("field_path", "must not be empty")
if not self.message:
raise ValidationError("message", "must not be empty")
@dataclass(frozen=True)
class ConfigValidateResult:
"""配置校验结果。
描述配置校验的最终结果包括是否有效错误列表与警告列表作为
``WizardAdapter.runWizardStep`` / ``DoctorAdapter.runItem``
配置校验流程的返回值PRD §4.0.4 核心方法 2配置校验
集合字段使用 tuple 以保证 frozen dataclass 的不可变语义
字段
valid: 是否校验通过
errors: 错误列表默认空 tuple
warnings: 警告列表默认空 tuple
"""
valid: bool
errors: tuple[ConfigError, ...] = ()
warnings: tuple[ConfigWarning, ...] = ()