mirror of
https://github.com/Yuyi-Oak/BlueArchiveToolkit.git
synced 2026-07-22 05:55:15 +08:00
feat(official-sync): 错误码模型铺开到 launcher/metadata 拉取路径
此前统一错误码只覆盖资源下载路径,launcher/metadata 链 (fetch_game_config → manifest URL → remote manifest → resources.assets → GameMainConfig)整条返回 Result<_, String>,经 anyhow::Error::msg 抹成无类型消息,RPC/任务层只能标为 internal。 本次将该链整体改为 Result<_, DownloadError>: - core 新增两个错误码:LAUNCHER_API_REJECTED(300031,官方启动器 API 返回非 200 业务码)与 LAUNCHER_RESPONSE_INVALID(600004,响应无法 解析或缺少必需字段),并纳入唯一性测试; - official_launcher:curl 失败保留准确网络域码(403/404/DNS/超时/TLS/ 代理等,final_error_code()),API 非 200 → LAUNCHER_API_REJECTED, 响应解析/缺字段 → LAUNCHER_RESPONSE_INVALID,非官方 manifest URL → NON_OFFICIAL_URL,manifest 无文件条目 → MANIFEST_PARSE_FAILED, 空版本/路径入参 → INVALID_ARGUMENT; - official_game_main_config:下载失败带网络域码(主/备 CDN 均失败时 以最终一次为准),ZIP 结构 → ZIP_STRUCTURE_INVALID,manifest 大小 不符 → SIZE_MISMATCH,GameMainConfig 解密/解析 → GAME_MAIN_CONFIG_FAILED,manifest 缺 source → LAUNCHER_RESPONSE_INVALID; - official_update 两处调用改 anyhow::Error::msg → anyhow::Error::new, 保留类型,task worker 现有 downcast 直接接住 launcher 路径错误码; - USERGUIDE 错误码表补录 300031 与 600004。 内部工具函数(launcher_package_url / launcher_api_url / launcher_authorization_header)仍返回 String,经 From<String> 归 INTERNAL——这些是硬编码常量上的内部不变量校验,非运行时主要失败面。 验证:新增 4 个单测断言映射(API 403 业务码 → 300031、非法 JSON → 600004、HTTP 404 → 300002、非官方 URL → 300030);全量 fmt / clippy --workspace --all-targets -D warnings / test --workspace 全绿(含 examples 编译)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -165,6 +165,8 @@ impl ErrorCode {
|
||||
pub const QUARANTINED: Self = Self::new(300_021, "quarantined", false);
|
||||
/// URL 不是官方 host(被拒绝)。
|
||||
pub const NON_OFFICIAL_URL: Self = Self::new(300_030, "non_official_url", false);
|
||||
/// 官方启动器 API 返回非 200 业务码(版本/鉴权被拒等)。
|
||||
pub const LAUNCHER_API_REJECTED: Self = Self::new(300_031, "launcher_api_rejected", false);
|
||||
/// 代理自身故障(认证/解析/连接代理失败)。
|
||||
pub const PROXY_FAILURE: Self = Self::new(310_001, "proxy_failure", false);
|
||||
|
||||
@@ -204,6 +206,9 @@ impl ErrorCode {
|
||||
pub const UNITYFS_PARSE_FAILED: Self = Self::new(600_002, "unityfs_parse_failed", false);
|
||||
/// GameMainConfig 解密/解析失败。
|
||||
pub const GAME_MAIN_CONFIG_FAILED: Self = Self::new(600_003, "game_main_config_failed", false);
|
||||
/// 官方启动器 API 响应无法解析或缺少必需字段(版本/路径/URL 等)。
|
||||
pub const LAUNCHER_RESPONSE_INVALID: Self =
|
||||
Self::new(600_004, "launcher_response_invalid", false);
|
||||
|
||||
// ---- 700xxx 任务/RPC ----
|
||||
/// 未知 RPC 方法。
|
||||
@@ -366,6 +371,7 @@ mod tests {
|
||||
ErrorCode::RETRY_EXHAUSTED,
|
||||
ErrorCode::QUARANTINED,
|
||||
ErrorCode::NON_OFFICIAL_URL,
|
||||
ErrorCode::LAUNCHER_API_REJECTED,
|
||||
ErrorCode::PROXY_FAILURE,
|
||||
ErrorCode::BLAKE3_MISMATCH,
|
||||
ErrorCode::OFFICIAL_HASH_MISMATCH,
|
||||
@@ -382,6 +388,7 @@ mod tests {
|
||||
ErrorCode::MANIFEST_PARSE_FAILED,
|
||||
ErrorCode::UNITYFS_PARSE_FAILED,
|
||||
ErrorCode::GAME_MAIN_CONFIG_FAILED,
|
||||
ErrorCode::LAUNCHER_RESPONSE_INVALID,
|
||||
ErrorCode::RPC_UNKNOWN_METHOD,
|
||||
ErrorCode::RPC_INVALID_PARAMS,
|
||||
ErrorCode::RPC_NOT_IMPLEMENTED,
|
||||
|
||||
Reference in New Issue
Block a user