1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
use random_number::random; use std::cmp::min; pub enum Charset { ASCII, Letters, LettersLowercase, LettersUppercase, Numbers, Special, } pub struct RandomString; impl RandomString { fn split_by_length(data: String, length: usize) -> Result<Vec<String>, &'static str> { if data == "".to_string() { return Err("String data can't be empty") } let mut vector_result: Vec<String> = vec![]; let mut str_temp: &str = data.as_str(); while !str_temp.is_empty() { let (pref, suf) = str_temp.split_at(min(length, str_temp.len())); vector_result.push(pref.to_string()); str_temp = suf; } Ok(vector_result) } pub fn get_charset(charset: Charset) -> String { return match charset { Charset::ASCII => "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890!@#$%^&*()_+-={}[]:\";'\\|,.<>/?`~".to_string(), Charset::Letters => "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM".to_string(), Charset::LettersLowercase => "qwertyuiopasdfghjklzxcvbnm".to_string(), Charset::LettersUppercase => "QWERTYUIOPASDFGHJKLZXCVBNM".to_string(), Charset::Numbers => "1234567890".to_string(), Charset::Special => "!@#$%^&*()_+-={}[]:\";'\\|,.<>/?`~".to_string(), } } pub fn generate(length: i32, charset: String) -> Result<String, &'static str>{ let vec_charset; match RandomString::split_by_length(charset, 1) { Ok(result) => vec_charset = result, Err(msg) => return Err(msg) } let mut random_string: String = "".to_string(); let mut i: u8; for _ in 0..length { i = random!(..=(vec_charset.len() - 1) as u8); random_string += vec_charset[i as usize].as_str(); } Ok(random_string) } }