Skip to main content

kubetsu_fake/
lib.rs

1#![doc = include_str!("../README.md")]
2
3#[doc(hidden)]
4pub mod __private {
5    pub use fake;
6    pub use kubetsu;
7}
8
9/// Implement `fake::Dummy<fake::Faker>` for a kubetsu ID type.
10///
11/// # Concrete form
12///
13/// ```rust
14/// kubetsu::define_id!(pub struct UserId(i64););
15/// kubetsu_fake::impl_fake!(UserId(i64));
16///
17/// use fake::{Fake, Faker};
18/// let _id: UserId = Faker.fake();
19/// ```
20///
21/// # Generic form
22///
23/// ```rust
24/// kubetsu::define_id!(pub struct MyId<T, U>;);
25/// kubetsu_fake::impl_fake!(MyId<T, U>);
26///
27/// struct User;
28/// type UserId = MyId<User, i64>;
29///
30/// use fake::{Fake, Faker};
31/// let _id: UserId = Faker.fake();
32/// ```
33#[macro_export]
34macro_rules! impl_fake {
35    // Concrete form: impl_fake!(UserId(i64));
36    ($name:ident($inner:ty)) => {
37        const _: () = {
38            fn _assert_kubetsu_id()
39            where
40                $name: $crate::__private::kubetsu::KubetsuId<Inner = $inner>,
41            {
42            }
43        };
44
45        impl $crate::__private::fake::Dummy<$crate::__private::fake::Faker> for $name {
46            fn dummy_with_rng<R: $crate::__private::fake::RngExt + ?Sized>(
47                config: &$crate::__private::fake::Faker,
48                rng: &mut R,
49            ) -> Self {
50                let inner = $crate::__private::fake::Fake::fake_with_rng::<$inner, R>(config, rng);
51                Self::new(inner)
52            }
53        }
54    };
55    // Generic form: impl_fake!(MyId<T, U>);
56    ($name:ident<$phantom:ident, $inner:ident>) => {
57        const _: () = {
58            fn _assert_kubetsu_id<$phantom, $inner>()
59            where
60                $name<$phantom, $inner>: $crate::__private::kubetsu::KubetsuId<Inner = $inner>,
61            {
62            }
63        };
64
65        impl<$phantom, $inner> $crate::__private::fake::Dummy<$crate::__private::fake::Faker>
66            for $name<$phantom, $inner>
67        where
68            $inner: $crate::__private::fake::Dummy<$crate::__private::fake::Faker>,
69        {
70            fn dummy_with_rng<R: $crate::__private::fake::RngExt + ?Sized>(
71                config: &$crate::__private::fake::Faker,
72                rng: &mut R,
73            ) -> Self {
74                let inner = $crate::__private::fake::Fake::fake_with_rng::<$inner, R>(config, rng);
75                Self::new(inner)
76            }
77        }
78    };
79}
80
81#[cfg(test)]
82mod tests {
83    use fake::{Fake, Faker};
84
85    kubetsu::define_id!(
86        pub struct UserId(i64);
87    );
88    kubetsu::define_id!(
89        pub struct ItemId(String);
90    );
91    crate::impl_fake!(UserId(i64));
92    crate::impl_fake!(ItemId(String));
93
94    kubetsu::define_id!(
95        pub struct MyId<T, U>;
96    );
97    crate::impl_fake!(MyId<T, U>);
98
99    struct User;
100    type MyUserId = MyId<User, i64>;
101
102    #[test]
103    fn test_fake_concrete() {
104        let _id: UserId = Faker.fake();
105    }
106
107    #[test]
108    fn test_fake_string() {
109        let _id: ItemId = Faker.fake();
110    }
111
112    #[test]
113    fn test_fake_generic() {
114        let _id: MyUserId = Faker.fake();
115    }
116}