grp_api/
lib.rs

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| { // Given the amount and upper bound, generate the random index
18    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    // l: amount of letters [A-Z,a-z], say length - symbol - number
38    // s: amount of symbols, say symbol
39    // n: amount of numbers [0-9], say number
40
41    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()) // generate the random index on corresponding Vec depend on its amount
52                    .iter()
53                    .map(|idx| args.1[*idx].clone())// index their values in to Vec<String>
54                    .collect()
55            })
56            .fold(vec![], |mut acc, mut x| { acc.append(&mut x); acc });
57    // unfold these Vec<Vec<String>> in to Vec<String>
58    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}