mirror of
https://github.com/Yuyi-Oak/BlueArchiveToolkit.git
synced 2026-09-18 06:34:54 +08:00
feat(sync): 接入解析缓存与汉化发布前置
补齐官方 release 解析缓存、TextUnit 明细索引、资源变更集、Crowdin handoff 预留、ResourceRepository 导入元数据和 localized release patch 前置链路。 同时开放文件级 patch.apply 与 UnityFS TextAsset/string/semantic field patch CLI/RPC 入口,并保留官方原版资源与汉化产物双目录发布状态。 验证:cargo test -p bat-assetbundle --locked;cargo clippy -p bat-assetbundle --all-targets --locked -- -D warnings;cargo test -p bat-infrastructure --locked。
This commit is contained in:
@@ -7,7 +7,9 @@ pub mod translation;
|
||||
|
||||
pub use game_client::{ClientStatus, GameClient, GameRegion};
|
||||
pub use game_version::{GameVersion, UnityVersion};
|
||||
pub use resource::{crc32_ieee, IntegrityMismatch, Resource, ResourceEntry, ResourceType};
|
||||
pub use resource::{
|
||||
crc32_ieee, IntegrityMismatch, Resource, ResourceEntry, ResourceMetadata, ResourceType,
|
||||
};
|
||||
pub use translation::{
|
||||
ExtractedText, SourceText, TextContext, TextMetadata, TextSource, TranslatedText,
|
||||
TranslationStatus,
|
||||
|
||||
@@ -43,6 +43,58 @@ pub struct ResourceEntry {
|
||||
pub crc: Option<u32>,
|
||||
}
|
||||
|
||||
/// 资源解析与发布侧元数据。
|
||||
///
|
||||
/// 该结构默认全空,保证旧索引和只保存基础 manifest 信息的资源仍可反序列化。
|
||||
/// 官方资源导入会按 release manifest 和 parse cache 填充这些字段,供
|
||||
/// `resource.index` 等只读接口暴露版本、平台、bundle、TextAsset 和 TextUnit 摘要。
|
||||
#[derive(Debug, Clone, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
|
||||
pub struct ResourceMetadata {
|
||||
/// 资源所属的官方 release ID。
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub official_release_id: Option<String>,
|
||||
/// 从官方相对路径推断的平台标签,例如 `windows` 或 `android`。
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub platform: Option<String>,
|
||||
/// 资源本身或所在 bundle 的官方相对路径。
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub bundle_path: Option<String>,
|
||||
/// ZIP 内被解析到的 bundle entry;直接 bundle 为空。
|
||||
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
||||
pub archive_entries: Vec<String>,
|
||||
/// parse cache 中出现过的解析状态标签。
|
||||
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
||||
pub parse_statuses: Vec<String>,
|
||||
/// 解析到的 Unity 版本集合。
|
||||
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
||||
pub unity_versions: Vec<String>,
|
||||
/// UnityFS directory file 总数。
|
||||
#[serde(default, skip_serializing_if = "is_zero")]
|
||||
pub unityfs_file_count: u64,
|
||||
/// Unity serialized file 总数。
|
||||
#[serde(default, skip_serializing_if = "is_zero")]
|
||||
pub serialized_file_count: u64,
|
||||
/// TextAsset 对象总数。
|
||||
#[serde(default, skip_serializing_if = "is_zero")]
|
||||
pub text_asset_count: u64,
|
||||
/// TextAsset 名称集合。
|
||||
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
||||
pub text_assets: Vec<String>,
|
||||
/// TextUnit 总数。
|
||||
#[serde(default, skip_serializing_if = "is_zero")]
|
||||
pub text_unit_count: u64,
|
||||
/// TextUnit 格式标签集合,例如 `json`、`csv`、`tsv`、`plain`。
|
||||
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
||||
pub text_unit_formats: Vec<String>,
|
||||
/// TextUnit 提取阶段的非致命诊断数量。
|
||||
#[serde(default, skip_serializing_if = "is_zero")]
|
||||
pub text_unit_error_count: u64,
|
||||
}
|
||||
|
||||
fn is_zero(value: &u64) -> bool {
|
||||
*value == 0
|
||||
}
|
||||
|
||||
/// 已下载字节与 catalog 声明的可校验字段不一致。
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub enum IntegrityMismatch {
|
||||
@@ -133,6 +185,9 @@ pub struct Resource {
|
||||
pub local_path: PathBuf,
|
||||
/// 资源条目
|
||||
pub entry: ResourceEntry,
|
||||
/// 解析、发布和索引侧扩展元数据。
|
||||
#[serde(default)]
|
||||
pub metadata: ResourceMetadata,
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
||||
Reference in New Issue
Block a user