rust_string_random/
lib.rs

1use std::error::Error;
2extern crate rand;
3
4use rand::prelude::*;
5
6static NUMBERS:&'static str = "0123456789";
7static LETTERS:&'static str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
8static SPECIALS:&'static str = "~!@#$%^*()_+-=[]{}|;:,./<>?";
9
10///
11/// Generate random string
12/// # Examples
13///
14/// ```
15///  use rust_string_random::{random, Options, RandWay};
16/// let options = Options {
17///            rand: RandWay::NORMAL,
18///            numbers: None,
19///            letters: None,
20///            specials: None
21///        };
22///  let res = random(5,options);
23///  let string = res.unwrap();
24/// ```
25pub fn random(mut length: i32, options: Options) -> Result<String, Box<dyn Error>> {
26    if length == 0 {
27        length = 8;
28    }
29
30    let mut chars = String::from("");
31    let mut result = String::from("");
32    match options.rand {
33        RandWay::NUMBER => {
34            chars.push_str(&options.numbers.unwrap_or(NUMBERS.to_string()));
35        }
36        RandWay::LETTER => {
37            chars.push_str(&options.letters.unwrap_or(LETTERS.to_string()));
38        }
39        RandWay::SPECIAL => {
40            chars.push_str(&options.specials.unwrap_or(SPECIALS.to_string()));
41        }
42        _ => {
43            chars.push_str(&options.numbers.unwrap_or(NUMBERS.to_string()));
44            chars.push_str(&options.letters.unwrap_or(LETTERS.to_string()));
45        }
46    }
47    let mut rng = thread_rng();
48    while length > 0 {
49        length = length-1;
50        let num = rng.gen_range(0f64, 1.0f64);// as usize * chars.len();
51        let num = num * chars.len() as f64;
52        let index_begin = num as usize - 1;
53        let x = &chars[index_begin..num as usize];
54        result.push_str(x);
55    }
56    Ok(result)
57}
58
59pub struct Options {
60    pub rand: RandWay,
61    pub numbers: Option<String>,
62    pub letters: Option<String>,
63    pub specials: Option<String>,
64}
65
66pub enum RandWay {
67    NORMAL,
68    NUMBER,
69    LETTER,
70    SPECIAL
71}
72
73#[cfg(test)]
74mod tests {
75    use super::*;
76
77    #[test]
78    fn string_random() {
79        let options = Options {
80            rand: RandWay::NORMAL,
81            numbers: None,
82            letters: None,
83            specials: None
84        };
85        let res = random(5,options);
86        let string = res.unwrap();
87        println!("{}",string);
88    }
89}