1#![allow(non_snake_case)]
2use rand::prelude::*;
3
4const _GEN: fn(Vec<(u8, u8)>) -> Vec<String> = |range_list| {
5 let mut all = vec![];
6 for (start, end) in range_list {
7 let mut v = (start..=end)
8 .collect::<Vec<u8>>()
9 .iter()
10 .map(|asc_num| (*asc_num as char).to_string())
11 .collect();
12 all.append(&mut v);
13 }
14 all
15};
16
17const _RAND_IDX: fn(usize, usize) -> Vec<usize> = |n, cnt| { let mut rng = rand::thread_rng();
19 let mut idx;
20 let mut idxs = vec![];
21 for _ in 0..n {
22 idx = rng.gen_range(0, cnt);
23 idxs.push(idx);
24 }
25 idxs
26};
27
28const _DATA: fn() -> (Vec<String>, Vec<String>, Vec<String>) = || {
29 let letters: Vec<String> = _GEN(vec![(65, 90), (97, 122)]);
30 let symbols: Vec<String> = _GEN(vec![(33, 47), (58, 64), (91, 96), (123, 126)]);
31 let numbers: Vec<String> = _GEN(vec![(48, 57)]);
32
33 (letters, symbols, numbers)
34};
35
36pub const GEN_PWD: fn(usize, usize, usize) -> String = |l, s, n| {
37 let mut rng = rand::thread_rng();
42 let data = _DATA();
43 let mut PWD =
44 vec![
45 (l, data.0),
46 (s, data.1),
47 (n, data.2),
48 ]
49 .iter()
50 .map(|args| {
51 _RAND_IDX(args.0, args.1.len()) .iter()
53 .map(|idx| args.1[*idx].clone()).collect()
55 })
56 .fold(vec![], |mut acc, mut x| { acc.append(&mut x); acc });
57 PWD.shuffle(&mut rng);
59 PWD.join("")
60};
61
62
63#[cfg(test)]
64mod tests {
65 use super::*;
66
67 #[test]
68 fn _GEN_works() {
69 assert_eq!(_GEN(vec![(48, 57)]), vec!["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]);
70 }
71
72 #[test]
73 fn _RAND_IDX_works() {
74 assert!(true);
75 }
76
77 #[test]
78 fn _DATA_works() {
79 assert!(true);
80 }
81
82 #[test]
83 fn GEN_PWD_works() {
84 assert!(true);
85 }
86}