random_string/
generator.rs

1/// Generates a random string with given length and charset.
2///
3/// Will Panic if the provided charset is empty.
4///
5/// # Arguments
6///
7/// * `length` - Length of a `String` to generate
8/// * `charset` - Object implementing `AsRef` trait to do reference-to-reference conversion into `&str`
9///
10/// # Example
11///
12/// ```
13/// use random_string::generate;
14///
15/// let charset = "1234567890";
16/// println!("{}", generate(6, charset));
17/// ```
18
19pub fn generate<S: AsRef<str>>(length: usize, charset: S) -> String {
20    let charset_str = charset.as_ref();
21
22    if charset_str.is_empty() {
23        panic!("Provided charset is empty! It should contain at least one character");
24    }
25
26    let chars: Vec<char> = charset_str.chars().collect();
27    let mut result = String::with_capacity(length);
28
29    unsafe {
30        for _ in 0..length {
31            result.push(
32                *chars.get_unchecked(fastrand::usize(0..chars.len()))
33            );
34        }
35    }
36
37    result
38}
39
40/// Calls the `generate` with random length out of provided, `range`
41///
42/// Will Panic if the provided charset in empty.
43///
44/// # Arguments
45///
46/// * `range` - `Range` of lenghts to choose from
47/// * `charset` - Object implementing `AsRef` trait to do reference-to-reference conversion into `&str`
48///
49/// # Example
50///
51/// ```
52/// use random_string::generate_rng;
53///
54/// let charset = random_string::charsets::ALPHA;
55/// println!("{}", generate_rng(3..7, charset));
56/// ```
57
58pub fn generate_rng<S: AsRef<str>>(range: std::ops::Range<usize>, charset: S) -> String {
59    generate(fastrand::usize(range), charset)
60}