1use rand::{distributions::Alphanumeric, thread_rng, Rng};
3
4fn alphanum(length: u8) -> String {
6 let mut rng = thread_rng();
7 (0..length)
8 .filter_map(|_| -> Option<char> { rng.sample(Alphanumeric).try_into().ok() })
9 .collect()
10}
11
12fn pin(length: u8) -> String {
15 let mut rng = thread_rng();
16 (0..length)
17 .filter_map(|_| -> Option<char> { rng.gen_range(b'0'..=b'9').try_into().ok() })
18 .collect()
19}
20
21fn everything(length: u8) -> String {
24 let mut rng = thread_rng();
25 (0..length)
26 .filter_map(|_| -> Option<char> { rng.gen_range(b'!'..=b'~').try_into().ok() })
27 .collect()
28}
29
30#[inline]
45#[must_use]
46pub fn generate(option: &str, length: u8) -> String {
47 match option {
48 "pin" => pin(length),
49 "full" => everything(length),
50 &_ => alphanum(length),
51 }
52}
53
54#[cfg(test)]
55mod tests;