Advertisement
TENXS

Rust Code

Jul 1st, 2020
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 2.99 KB | None | 0 0
  1. #![allow(non_snake_case)]
  2. use rand::prelude::*;
  3.  
  4. const _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.  
  17. const _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.  
  28. const _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.  
  36. pub 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. #[cfg(test)]
  63. mod tests {
  64.     use super::*;
  65.  
  66.     #[test]
  67.     fn _GEN_works() {
  68.         assert_eq!(_GEN(vec![(48, 57)]), vec!["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]);
  69.         assert_eq!(_GEN(vec![(33, 47), (58, 64), (91, 96), (123, 126)]), vec!["!", "\"", "#", "$", "%", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", ":", ";", "<", "=", ">", "?", "@", "[", "\\", "]", "^", "_", "`", "{", "|", "}", "~"]);
  70.         assert_eq!(_GEN(vec![(65, 90), (97, 122)]), vec!["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]);
  71.     }
  72.  
  73.     #[test]
  74.     fn _RAND_IDX_works() {
  75.         let ret = _RAND_IDX(10_000, 100_0000)
  76.                     .iter()
  77.                     .filter(|x| **x > 100_0000)
  78.                     .collect::<Vec<&usize>>()
  79.                     .is_empty();
  80.  
  81.         assert!(ret);
  82.     }
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement