# ADR 0001: Rust 引擎与 Go 应用层边界 **状态**:已接受 **日期**:2026-06-28 **关联计划**:`../../../PROJECT_PLAN.md` --- ## 背景 BlueArchiveToolkit 的最终目标覆盖资源同步、CAS、AssetBundle 解析、文本提取、翻译、Patch、CLI、API Server、Web 和 SDK。项目天然包含二进制解析、文件完整性、网络同步、任务编排、数据库、用户界面等不同类型的问题。 如果所有能力都堆在一种语言或一个模块里,后续会出现以下问题: 1. 性能敏感和安全敏感代码难以隔离测试。 2. CLI/API/Web 编排逻辑容易污染底层解析器。 3. FFI 和 SDK 边界无法稳定。 4. 插件系统没有清晰接入点。 --- ## 决策 采用明确的语言和层次边界: 1. **Rust 引擎层** - 负责 CAS、AssetBundle、Patch、二进制格式解析、Hash、完整性校验。 - 只暴露粗粒度、可测试、稳定的 API。 - 不承担 CLI 命令解析、HTTP 路由、AI Provider 编排或 Web 状态管理。 2. **Rust 领域/适配层** - `core` 保存领域模型、仓储接口和领域错误。 - `adapters` 保存 Unity、Manifest、Client 等适配器接口和注册机制。 - `infrastructure` 将引擎实现适配到领域仓储接口。 3. **Go 应用层** - 负责 CLI、资源同步、下载器、API Server、任务调度、配置、日志、Provider 编排。 - 通过 FFI、进程边界或稳定 SDK 调用 Rust 引擎能力。 - 不重复实现 AssetBundle 解析、Patch 算法或 CAS 对象存储核心逻辑。 4. **Web 层** - 通过 REST API 访问服务端能力。 - 不直接读取本地 CAS 或游戏资源文件。 --- ## 约束 1. Rust 引擎 API 必须保持业务无关,不出现 CLI 命令、HTTP 状态码、Web 页面状态。 2. Go 应用层不得复制 Rust 引擎中的 Hash、Patch、AssetBundle 核心算法。 3. FFI 边界必须避免暴露大量细粒度内部结构,优先暴露批量和事务语义。 4. 所有跨语言错误必须能映射到统一错误码和可读诊断信息。 --- ## 后果 正面影响: 1. 核心引擎可以独立测试和基准测试。 2. CLI/API/Web 可以复用同一套底层能力。 3. 后续新增 Provider、Parser、Storage backend 时边界更清晰。 代价: 1. 需要维护 FFI 或 SDK 边界。 2. 错误类型、数据结构和版本兼容性需要更早设计。 3. 集成测试必须覆盖跨语言调用,而不能只看单 crate 单元测试。 --- ## 当前执行要求 近期实现 CAS 时必须遵守: 1. `crates/bat-cas-engine` 是 CAS 核心实现位置。 2. `infrastructure` 不再复制 CAS 存储算法,只做 `bat-core::repositories::CasRepository` 适配。 3. Go CLI 后续通过稳定边界调用 CAS,不直接操作 CAS 内部目录结构。