#unique-identifier #safe #globally #type-safe #prefix #id #k-sortable

type-safe-id

一个类型安全、K排序、全局唯一标识符

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模式

Download history 299/week @ 2024-05-01 182/week @ 2024-05-08 453/week @ 2024-05-15 362/week @ 2024-05-22 273/week @ 2024-05-29 264/week @ 2024-06-05 418/week @ 2024-06-12 474/week @ 2024-06-19 471/week @ 2024-06-26 612/week @ 2024-07-03 647/week @ 2024-07-10 477/week @ 2024-07-17 1076/week @ 2024-07-24 832/week @ 2024-07-31 547/week @ 2024-08-07 420/week @ 2024-08-14

每月下载 2,988
8 个crate中使用 (via pavex)

MIT/Apache

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