rust_string_random/
lib.rs1use 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
10pub 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);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}