#uuid #typed #unique #guid

no-std typed-uuid

在 Uuid 之上封装的泛型包装器,以区分不同的 Id

5 个版本

0.2.0 2023 年 6 月 11 日
0.1.3 2023 年 1 月 16 日
0.1.2 2023 年 1 月 16 日
0.1.1 2023 年 1 月 16 日
0.1.0 2023 年 1 月 15 日

#15 in #guid

每月 25 次下载

MIT 许可证

19KB
340

typed-uuid 最新版本 文档

Id 是对 uuid::Uuid 的泛型包装器。

使用它来添加类型安全,并防止不同类型的 Uuid 之间的混淆。

示例

表示不同类型的 Id 以防止混淆或无效状态。例如,描述一个唯一资源与另一个资源的关系,例如 UserRole,关系可以表示如下

// Subtype the Id type to specify the version of the Id, instead
// of repeating yourself everywhere.
type Id<T> = typed_uuid::Id<T, typed_uuid::V4>;

struct Relation {
    user: Id<User>,
    role: Id<Role>,
}

不同 T 参数类型的 Id 是不兼容的,不能进行比较。

尝试将 Id<User> 赋值给类型为 Id<Role> 的变量会导致编译错误。

let user = Id::<User>::new();
let role = Id::<Role>::new();

// Compilation fails here, can't compare Id<User> and Id<Role>
assert_eq!(user, role);

但相同类型的 Id 可以正常工作

let mut first = Id::<User>::new();
let second = Id::<User>::new();

first = second;
assert_eq!(first, second);

用法

当你依赖这个库时,你需要显式选择你将使用的 uuid 版本,以及可选的 serde 支持

[dependencies.typed-uuid]
version = "*"
default-features = false
features = ["v4", "serde"]

依赖项

~210–540KB
~10K SLoC