6个版本 (3个破坏性更新)
0.3.0 | 2024年4月22日 |
---|---|
0.2.1 | 2023年7月6日 |
0.1.1 | 2023年6月29日 |
0.0.0 | 2023年6月29日 |
#320 in Rust模式
每月下载 2,988 次
在 8 个crate中使用 (via pavex)
20KB
344 行
type-safe-id
一个类型安全、K排序、全局唯一标识符。
在Rust中实现的https://github.com/jetpack-io/typeid的 typed 实现。
示例
静态类型前缀
这是预期中的快乐路径。使用StaticType实现,你确保正在解析的ID是预期类型。
use type_safe_id::{StaticType, TypeSafeId};
#[derive(Default)]
struct User;
impl StaticType for User {
// must be lowercase ascii [a-z] only
const TYPE: &'static str = "user";
}
// type alias for your custom typed id
type UserId = TypeSafeId<User>;
let user_id1 = UserId::new();
# std::thread::sleep(std::time::Duration::from_millis(10));
let user_id2 = UserId::new();
let uid1 = user_id1.to_string();
let uid2 = user_id2.to_string();
dbg!(&uid1, &uid2);
assert!(uid2 > uid1, "type safe IDs are ordered");
let user_id3: UserId = uid1.parse().expect("invalid user id");
let user_id4: UserId = uid2.parse().expect("invalid user id");
assert_eq!(user_id1.uuid(), user_id3.uuid(), "round trip works");
assert_eq!(user_id2.uuid(), user_id4.uuid(), "round trip works");
动态类型前缀
如果你不知道前缀会是什么,你可以使用DynamicType前缀。
use type_safe_id::{DynamicType, TypeSafeId};
let id: TypeSafeId<DynamicType> = "prefix_01h2xcejqtf2nbrexx3vqjhp41".parse().unwrap();
assert_eq!(id.type_prefix(), "prefix");
assert_eq!(id.uuid(), uuid::uuid!("0188bac7-4afa-78aa-bc3b-bd1eef28d881"));
帮助
error[E0080]: evaluation of `<Index as type_safe_id::StaticType>::__TYPE_PREFIX_IS_VALID` failed
--> /Users/conrad/Documents/code/type-safe-id/src/lib.rs:76:13
|
76 | assert!(Self::TYPE.as_bytes()[i].is_ascii_lowercase());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the evaluated program panicked at 'assertion failed: Self::TYPE.as_bytes()[i].is_ascii_lowercase()', /Users/conrad/Documents/code/type-safe-id/src/lib.rs:76:13
这个编译器错误表明,由于包含非ASCII小写值,你的静态类型前缀无效。
error[E0080]: evaluation of `<Index as type_safe_id::StaticType>::__TYPE_PREFIX_IS_VALID` failed
--> /Users/conrad/Documents/code/type-safe-id/src/lib.rs:73:9
|
73 | assert!(Self::TYPE.len() < 64);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the evaluated program panicked at 'assertion failed: Self::TYPE.len() < 64', /Users/conrad/Documents/code/type-safe-id/src/lib.rs:73:9
|
这个编译器错误表明,由于包含超过63个字符,你的静态类型前缀无效。
依赖项
~0.8–1.4MB
~29K SLoC