rust_mockdata/
lib.rs

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; // Avoid division by zero
20        }
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  }