ForcePilot/backend/package/yuxi/channels/application/usecase/failure_detail.py

45 lines
1.5 KiB
Python
Raw Normal View History

"""失败详情构造函数D16
抽离 ``ChannelControlService._toFailureDetail`` ``AdminMessageService``
的重复逻辑为模块级函数供两个 service 复用
"""
from __future__ import annotations
from yuxi.channels.contract.dtos.common import FailureDetail
from yuxi.channels.contract.errors import Error
__all__ = ["toFailureDetail"]
def toFailureDetail(target: str, err: Error | None) -> FailureDetail:
"""将管道错误转换为失败详情。
``err`` 非空时使用错误的 ``error_code`` ``message`` 构造失败
详情并提取 ``err.details`` 业务字段存入 ``details``
``raiseOnControlFailure`` 反向重构异常时保留 ``resource`` / ``id`` /
``field`` / ``rule`` 等业务字段为空时管道返回失败但未携带错误
对象使用 ``INTERNAL`` 通用错误码与兜底消息构造
参数
target: 失败目标操作类型 / 投递目标等写入 ``FailureDetail.target``
err: 管道返回的错误对象None 时使用通用错误码
返回
失败详情
"""
if err is not None:
return FailureDetail(
target=target,
error_code=err.error_code,
message=err.message,
retryable=False,
details=err.details or None,
)
return FailureDetail(
target=target,
error_code="INTERNAL",
message="pipeline failed without error",
retryable=False,
)