3 个不稳定版本
0.2.0 | 2024 年 1 月 27 日 |
---|---|
0.1.1 | 2024 年 1 月 27 日 |
0.1.0 | 2024 年 1 月 27 日 |
#1045 在 编码
每月 23 次下载
37KB
1K SLoC
库别斯:区分其他结构体的值类型
这是一个区分结构体值类型为其他类型值的库。
kubetsu
(区別)在日语中意为区分。
使用方法
use kubetsu::Id;
struct User {
id: Id<Self, i64>
}
type UserId = Id<User, i64>;
struct Item {
id: Id<Self, i64>
}
type ItemId = Id<Item, i64>;
fn main() {
let user_id = UserId::new(1);
let item_id = ItemId::new(1);
assert_ne!(user_id, item_id);
// compile error
// ---- src/lib.rs - Id (line 10) stdout ----
// error[E0308]: mismatched types
// --> src/lib.rs:29:3
// |
// 21 | assert_ne!(user_id, item_id); // compile error
// | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Id<User, i64>`, found `Id<Item, i64>`
// |
// = note: expected struct `Id<User, _>`
// found struct `Id<Item, _>`
// = note: this error originates in the macro `assert_ne` (in Nightly builds, run with -Z macro-backtrace for more info)
// error: aborting due to previous error
}
struct User {}
type UserId = kubetsu::Id<User, i64>;
let user_id = UserId::new(1);
// you can access original value reference with `inner()`.
assert_eq!(&1, user_id.inner());
// you can use `==` that have same value`.
assert_eq!(UserId::new(1), user_id);
serde 支持
如果您使用 [serde] 包并启用 feature = "serde",则可以像原始值一样进行序列化和反序列化。
use kubetsu::Id;
#[derive(serde::Serialize, serde::Deserialize)]
struct User {
id: Id<Self, i64>
}
fn main() {
let user = User { id: Id::new(1) };
let str = serde_json::to_string(&user).unwrap();
assert_eq!("{\"id\":1}", str);
// you can deserialize
let _: User = serde_json::from_str(&str).unwrap();
}
sqlx 支持
如果您使用 sqlx 包并启用 feature = "sqlx",则可以编码和解码 Id
值。您可以为每个驱动程序选择 "sqlx-xxxx" 功能。("sqlx-any", "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite")
#[derive(sqlx::FromRow)]
struct User {
id: kubetsu::Id<Self, i64>
}
async fn do_something_with_sqlx(conn: sqlx::AnyPool) -> Result<(), sqlx::Error> {
let mut tx = conn.begin().await?;
let user: User = sqlx::query_as("SELECT 1 as `id`").fetch_one(&mut *tx).await?;
// do something with user
// you can also pass to bind
let user2: User = sqlx::query_as("SELECT 1 as `id` WHERE 1 = ?").bind(&user.id).fetch_one(&mut *tx).await?;
Ok(())
}
fake 支持
如果您使用 fake 包并启用 feature = "fake",则可以使用 Faker.fake()
。
use kubetsu::Id;
use fake::{Faker, Fake, Dummy};
#[derive(Dummy)]
struct User {
id: Id<Self, i64>
}
fn main() {
let user: User = Faker.fake();
// do something with user
}
安装
$ cargo add kubetsu
许可证
MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT) 查看 LICENSE
Copyright (c) 2024 Keiji Yoshimi
依赖关系
~0–14MB
~176K SLoC