#struct #value #user #fake #sqlx #id #distinguish

kubetsu

区分其他结构体的值类型

3 个不稳定版本

0.2.0 2024 年 1 月 27 日
0.1.1 2024 年 1 月 27 日
0.1.0 2024 年 1 月 27 日

#1045编码

每月 23 次下载

MIT 许可证

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