az-drive-core
自动收集自
crates/storage/az-drive-core/README.md。
独立 AIO 网盘的核心路径规范化、版本模型与冲突决策逻辑。
功能
- 路径规范化与校验:定义 [
RootAlias](跨设备逻辑根名称)和 [RelativePath](POSIX 规范化相对路径),拒绝遍历攻击、绝对路径和 Windows 盘符前缀 - 本地↔远程路径映射:[
RootRegistry] 将逻辑根别名映射到设备本地绝对路径,通过最长前缀匹配解析主机路径 - 版本与锁模型:[
EntryVersion](UUID + 单调递增版本号 + SHA-256 内容哈希)和 [LockSnapshot](设备持有锁及过期时间)建模远程状态 - 同步决策逻辑:[
decide_local_change()] 比较本地基线版本、远程版本、内容哈希和活跃锁,输出 [ChangeDecision](无变化 / 上传新版本 / 冲突 / 被其他设备锁定) - 内容寻址哈希:[
content_hash()] 计算确定性 SHA-256 十六进制摘要;[object_key_for_hash()] 生成内容寻址对象存储键 - 冲突文件命名:[
conflict_file_name()] 生成确定性的本地冲突副本文件名(如report.conflict.mac-book.20260509T123000Z.docx) - 保守文本合并:[
try_safe_text_merge()] 尝试仅追加模式的安全合并,遇到歧义时返回None - CLI 路径展开:[
expand_path_expression()] 处理~、$HOME、${HOME}、%USERPROFILE%展开(仅限本地,不存储为远程标识)
安装
在 Cargo.toml 中添加:
[dependencies]
az-drive-core = { path = "../az-drive-core" } # workspace 内部引用
# 或发布后:
# az-drive-core = "0.1" # crates.io 引用
用法
use az_drive_core::{
RootAlias, RelativePath, RootRegistry, EntryVersion,
decide_local_change, content_hash, expand_path_expression,
};
// 注册逻辑根并解析本地路径
let mut registry = RootRegistry::default();
registry.register(
RootAlias::try_new("home").unwrap(),
std::path::PathBuf::from("/Users/me/Documents"),
)?;
let mapping = registry.resolve_host_path(std::path::Path::new("/Users/me/Documents/report.docx"))?;
// 计算内容哈希
let hash = content_hash(b"hello world");
// 同步决策
let decision = decide_local_change(&base_version, &remote_version, &content_hash, &lock);
依赖的 crates
chrono- 日期时间处理,用于版本时间戳serde- 序列化与反序列化sha2- SHA-256 内容哈希计算thiserror- 错误类型派生uuid- 通用唯一标识符,用于条目和设备标识