1use std::collections::HashMap;
2
3pub struct MockData {
4 seed: u64,
5}
6
7impl MockData {
8 pub fn new(seed: u64) -> Self {
9 Self { seed }
10 }
11
12 fn next_seed(&mut self) -> u64 {
13 self.seed = self.seed.wrapping_mul(6364136223846793005).wrapping_add(1);
14 self.seed
15 }
16
17 pub fn integer(&mut self, min: i64, max: i64) -> i64 {
18 if max <= min {
19 return min; }
21 min + (self.next_seed() % ((max - min + 1) as u64)) as i64
22 }
23
24 pub fn string(&mut self, length: usize) -> String {
25 const CHARSET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
26 (0..length)
27 .map(|_| {
28 let index = self.integer(0, CHARSET.len() as i64 - 1) as usize;
29 CHARSET[index] as char
30 })
31 .collect()
32 }
33
34 pub fn name(&mut self) -> String {
35 let first_names = ["Alice", "Bob", "Charlie", "David", "Eve"];
36 let last_names = ["Smith", "Johnson", "Williams", "Brown", "Davis"];
37
38 let first = first_names[self.integer(0, first_names.len() as i64 - 1) as usize];
39 let last = last_names[self.integer(0, last_names.len() as i64 - 1) as usize];
40
41 format!("{} {}", first, last)
42 }
43
44 pub fn email(&mut self) -> String {
45 let domains = ["example.com", "mail.com", "test.org"];
46 let domain = domains[self.integer(0, domains.len() as i64 - 1) as usize];
47
48 format!("{}@{}", self.string(8), domain)
49 }
50
51 pub fn phone(&mut self) -> String {
52 format!(
53 "+{}-{}-{}",
54 self.integer(1, 99),
55 self.integer(100, 999),
56 self.integer(1000, 9999)
57 )
58 }
59
60 pub fn address(&mut self) -> String {
61 format!(
62 "{} {}, {}",
63 self.integer(100, 999),
64 self.string(8),
65 self.string(6)
66 )
67 }
68
69 pub fn country(&mut self) -> String {
70 let countries = ["USA", "Canada", "UK", "Germany", "France"];
71 countries[self.integer(0, countries.len() as i64 - 1) as usize].to_string()
72 }
73
74 pub fn job_title(&mut self) -> String {
75 let jobs = ["Software Engineer", "Data Scientist", "Doctor", "Artist", "Teacher"];
76 jobs[self.integer(0, jobs.len() as i64 - 1) as usize].to_string()
77 }
78
79 pub fn credit_card(&mut self) -> String {
80 format!(
81 "{}-{}-{}-{}",
82 self.integer(1000, 9999),
83 self.integer(1000, 9999),
84 self.integer(1000, 9999),
85 self.integer(1000, 9999)
86 )
87 }
88
89 pub fn date(&mut self) -> String {
90 format!(
91 "{:04}-{:02}-{:02}",
92 self.integer(1900, 2023),
93 self.integer(1, 12),
94 self.integer(1, 28)
95 )
96 }
97
98 pub fn time(&mut self) -> String {
99 format!(
100 "{:02}:{:02}:{:02}",
101 self.integer(0, 23),
102 self.integer(0, 59),
103 self.integer(0, 59)
104 )
105 }
106
107 pub fn paragraph(&mut self, sentences: usize) -> String {
108 let sentence_lengths: Vec<usize> = (0..sentences)
109 .map(|_| self.integer(5, 15) as usize)
110 .collect();
111
112 sentence_lengths
113 .into_iter()
114 .map(|len| self.sentence(len))
115 .collect::<Vec<String>>()
116 .join(" ")
117 }
118
119 pub fn sentence(&mut self, words: usize) -> String {
120 let word_lengths: Vec<usize> = (0..words)
121 .map(|_| self.integer(3, 10) as usize)
122 .collect();
123
124 let mut sentence = word_lengths
125 .into_iter()
126 .map(|len| self.string(len))
127 .collect::<Vec<String>>()
128 .join(" ");
129
130 sentence.push('.');
131 sentence
132 }
133
134 pub fn uuid(&mut self) -> String {
135 format!(
136 "{:08x}-{:04x}-{:04x}-{:04x}-{:012x}",
137 self.integer(0, u32::MAX as i64),
138 self.integer(0, u16::MAX as i64),
139 self.integer(0, u16::MAX as i64),
140 self.integer(0, u16::MAX as i64),
141 self.integer(0, u64::MAX as i64) & 0xFFFFFFFFFFFF
142 )
143 }
144
145 pub fn json(&mut self) -> HashMap<String, String> {
146 let mut map = HashMap::new();
147 map.insert("uuid".to_string(), self.uuid());
148 map.insert("name".to_string(), self.name());
149 map.insert("email".to_string(), self.email());
150 map.insert("phone".to_string(), self.phone());
151 map.insert("address".to_string(), self.address());
152 map.insert("country".to_string(), self.country());
153 map.insert("job_title".to_string(), self.job_title());
154 map.insert("credit_card".to_string(), self.credit_card());
155 map.insert("date".to_string(), self.date());
156 map.insert("time".to_string(), self.time());
157 map.insert("bio".to_string(), self.paragraph(3));
158 map
159 }
160 }