😺

PhantomDataがある型をFaker.fake()する

2024/01/07に公開

fake-rs を導入するとテスト時などのランダムデータ生成が楽なので便利です。

#[tokio::test]
async fn test_case() {
  let user_id: Id<User> = Faker.fake();
  ...
}

UserIdのようなものをgenericな型にするためにPhantomData を導入していたが、Dummy をderiveできなかったので、自前で実装しました。

pub struct Id<T> {
    id: i64,
    _phantom: PhantomData<T>,
}

impl<T> Id<T> {
    pub fn new(id: i64) -> Self {
        Self {
            id,
            _phantom: PhantomData,
        }
    }
}

impl<T> Dummy<Faker> for Id<T> {
    fn dummy_with_rng<R: Rng + ?Sized>(config: &Faker, rng: &mut R) -> Self {
        let id = Fake::fake_with_rng::<i64, R>(config, rng);
        Self::new(id)
    }
}

内包している型で Fake::fake_with_rng<T, R> を呼びだして値を生成したあと、その値を使ってstructを作成するというパターンになりそうです。

やり方わからんなーと思って結構色々試行錯誤していたけどDummyのmanualでどう展開されるのか書いてあったのでそのとおりやるだけだったっぽい。

Discussion