Skip to main content

rok_orm_factory/
faker.rs

1//! [`Faker`] — simple random data generator for factory definitions.
2
3use rand::Rng;
4use uuid::Uuid;
5
6/// Simple random data generator for use in factory `definition()` methods.
7pub struct Faker;
8
9impl Faker {
10    /// Random first name.
11    pub fn name() -> String {
12        let names = [
13            "Alice", "Bob", "Carol", "Dave", "Eve", "Frank", "Grace", "Hank", "Iris", "Jack",
14            "Karen", "Leo", "Mia", "Nora", "Oscar", "Pam",
15        ];
16        let idx = rand::thread_rng().gen_range(0..names.len());
17        names[idx].to_string()
18    }
19
20    /// Random last name.
21    pub fn last_name() -> String {
22        let names = [
23            "Smith", "Jones", "Williams", "Brown", "Taylor", "Anderson", "Wilson", "Moore",
24            "Jackson", "White", "Harris", "Martin",
25        ];
26        let idx = rand::thread_rng().gen_range(0..names.len());
27        names[idx].to_string()
28    }
29
30    /// Random full name.
31    pub fn full_name() -> String {
32        format!("{} {}", Self::name(), Self::last_name())
33    }
34
35    /// Random email based on the name.
36    pub fn email() -> String {
37        format!(
38            "{}.{}@example.com",
39            Self::name().to_lowercase(),
40            Self::last_name().to_lowercase(),
41        )
42    }
43
44    /// Random UUID string.
45    pub fn uuid() -> String {
46        Uuid::new_v4().to_string()
47    }
48
49    /// Random integer in the given range (inclusive).
50    pub fn integer(lo: i64, hi: i64) -> i64 {
51        rand::thread_rng().gen_range(lo..=hi)
52    }
53
54    /// Random boolean (50/50).
55    pub fn boolean() -> bool {
56        rand::thread_rng().gen_bool(0.5)
57    }
58
59    /// Random lorem ipsum word.
60    pub fn word() -> String {
61        let words = [
62            "lorem",
63            "ipsum",
64            "dolor",
65            "sit",
66            "amet",
67            "consectetur",
68            "adipiscing",
69            "elit",
70            "sed",
71            "eiusmod",
72            "tempor",
73            "incididunt",
74        ];
75        let idx = rand::thread_rng().gen_range(0..words.len());
76        words[idx].to_string()
77    }
78
79    /// Random sentence of `n` words.
80    pub fn sentence(words: usize) -> String {
81        let mut s: Vec<String> = (0..words).map(|_| Self::word()).collect();
82        if let Some(first) = s.first_mut() {
83            let mut chars = first.chars();
84            *first = chars
85                .next()
86                .map(|c| c.to_uppercase().collect::<String>() + chars.as_str())
87                .unwrap_or_default();
88        }
89        s.join(" ") + "."
90    }
91
92    /// Random URL.
93    pub fn url() -> String {
94        format!("https://example.com/{}", Self::uuid())
95    }
96
97    /// Random phone number string.
98    pub fn phone() -> String {
99        let mut rng = rand::thread_rng();
100        format!(
101            "+1-{:03}-{:03}-{:04}",
102            rng.gen_range(200..=999),
103            rng.gen_range(200..=999),
104            rng.gen_range(1000..=9999),
105        )
106    }
107
108    /// Random password (plain text — hash it before storing!).
109    pub fn password() -> String {
110        format!("pass-{}", &Uuid::new_v4().to_string()[..8])
111    }
112}