use crate::char::{char_custom, get_charset_from_opts, GenCharOpts};
fn gen_char_from_opts(length: u32, opts: GenCharOpts) -> String {
let charset = get_charset_from_opts(opts);
gen_key(length, &charset) }
fn gen_key(length: u32, charset: &str) -> String {
let mut output = String::from("");
for _n in 1..=length {
let c = char_custom(charset);
output.push(c);
}
output
}
pub fn key(length: u32) -> String {
let opts = GenCharOpts {
nums: true,
letters: true,
upper: true,
safe_sp_chars: true,
unsafe_sp_chars: false,
};
gen_char_from_opts(length, opts)
}
pub fn key_custom(length: u32, charset: String) -> String {
gen_key(length, &charset)
}
pub fn nums(length: u32) -> String {
let opts = GenCharOpts {
nums: true,
letters: false,
upper: false,
safe_sp_chars: false,
unsafe_sp_chars: false,
};
gen_char_from_opts(length, opts)
}
pub fn letters(length: u32) -> String {
let opts = GenCharOpts {
nums: false,
letters: true,
upper: true,
safe_sp_chars: false,
unsafe_sp_chars: false,
};
gen_char_from_opts(length, opts)
}
pub fn letters_lower(length: u32) -> String {
let opts = GenCharOpts {
nums: false,
letters: true,
upper: false,
safe_sp_chars: false,
unsafe_sp_chars: false,
};
gen_char_from_opts(length, opts)
}
pub fn letters_upper(length: u32) -> String {
let opts = GenCharOpts {
nums: false,
letters: true,
upper: false,
safe_sp_chars: false,
unsafe_sp_chars: false,
};
gen_char_from_opts(length, opts).to_uppercase()
}
pub fn nums_and_letters(length: u32) -> String {
let opts = GenCharOpts {
nums: true,
letters: true,
upper: true,
safe_sp_chars: false,
unsafe_sp_chars: false,
};
gen_char_from_opts(length, opts)
}
pub fn nums_and_letters_lower(length: u32) -> String {
let opts = GenCharOpts {
nums: true,
letters: true,
upper: false,
safe_sp_chars: false,
unsafe_sp_chars: false,
};
gen_char_from_opts(length, opts)
}
pub fn nums_and_letters_upper(length: u32) -> String {
let opts = GenCharOpts {
nums: true,
letters: true,
upper: false,
safe_sp_chars: false,
unsafe_sp_chars: false,
};
gen_char_from_opts(length, opts).to_uppercase()
}
pub fn special_chars(length: u32) -> String {
let opts = GenCharOpts {
nums: false,
letters: false,
upper: false,
safe_sp_chars: true,
unsafe_sp_chars: false,
};
gen_char_from_opts(length, opts)
}
pub fn special_chars_unsafe(length: u32) -> String {
let opts = GenCharOpts {
nums: false,
letters: false,
upper: false,
safe_sp_chars: false,
unsafe_sp_chars: true,
};
gen_char_from_opts(length, opts)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::test_utils::test_correct_chars;
#[test]
fn test_length() {
let length = 32;
let key = key(length);
assert_eq!(key.len(), 32);
}
enum FunctionType {
Key,
Nums,
Letters,
LettersLower,
NumsAndLetters,
NumsAndLettersLower,
SpecialChars,
SpecialCharsUnsafe,
}
fn test_key_from_opts(opts: GenCharOpts, fn_type: FunctionType) -> bool {
let charset = get_charset_from_opts(opts);
let length = 32;
let key: String = match fn_type {
FunctionType::Key => key(length),
FunctionType::Nums => nums(length),
FunctionType::Letters => letters(length),
FunctionType::LettersLower => letters_lower(length),
FunctionType::NumsAndLetters => nums_and_letters(length),
FunctionType::NumsAndLettersLower => nums_and_letters_lower(length),
FunctionType::SpecialChars => special_chars(length),
FunctionType::SpecialCharsUnsafe => special_chars_unsafe(length),
};
test_correct_chars(key, &charset)
}
#[test]
fn test_correct_characters_key() {
let opts = GenCharOpts {
nums: true,
letters: true,
upper: true,
safe_sp_chars: true,
unsafe_sp_chars: false,
};
let result = test_key_from_opts(opts, FunctionType::Key);
if !result {
panic!("Key contained an invalid character.");
}
}
#[test]
fn test_correct_characters_nums() {
let opts = GenCharOpts {
nums: true,
letters: false,
upper: false,
safe_sp_chars: false,
unsafe_sp_chars: false,
};
let result = test_key_from_opts(opts, FunctionType::Nums);
if !result {
panic!("Nums contained an invalid character.");
}
}
#[test]
fn test_correct_characters_letters() {
let opts = GenCharOpts {
nums: false,
letters: true,
upper: true,
safe_sp_chars: false,
unsafe_sp_chars: false,
};
let result = test_key_from_opts(opts, FunctionType::Letters);
if !result {
panic!("Letters contained an invalid character.");
}
}
#[test]
fn test_correct_characters_letters_lower() {
let opts = GenCharOpts {
nums: false,
letters: true,
upper: false,
safe_sp_chars: false,
unsafe_sp_chars: false,
};
let result = test_key_from_opts(opts, FunctionType::LettersLower);
if !result {
panic!("LettersLower contained an invalid character.");
}
}
#[test]
fn test_correct_characters_letters_upper() {
let upper_case = crate::char::LETTERS.to_uppercase();
let result = test_correct_chars(letters_upper(32), &upper_case);
if !result {
panic!("LettersUpper contained an invalid character.");
}
}
#[test]
fn test_correct_characters_nums_and_letters() {
let opts = GenCharOpts {
nums: true,
letters: true,
upper: true,
safe_sp_chars: false,
unsafe_sp_chars: false,
};
let result = test_key_from_opts(opts, FunctionType::NumsAndLetters);
if !result {
panic!("NumsAndLetters contained an invalid character.");
}
}
#[test]
fn test_correct_characters_nums_and_letters_lower() {
let opts = GenCharOpts {
nums: true,
letters: true,
upper: false,
safe_sp_chars: false,
unsafe_sp_chars: false,
};
let result =
test_key_from_opts(opts, FunctionType::NumsAndLettersLower);
if !result {
panic!("NumsAndLettersLower contained an invalid character.");
}
}
#[test]
fn test_correct_characters_nums_and_letters_upper() {
let upper_case = crate::char::LETTERS.to_uppercase();
let nums = crate::char::NUMBERS;
let mut charset = String::from("");
charset.push_str(&upper_case);
charset.push_str(nums);
let result = test_correct_chars(nums_and_letters_upper(32), &charset);
if !result {
panic!("LettersUpper contained an invalid character.");
}
}
#[test]
fn test_correct_characters_special_chars() {
let opts = GenCharOpts {
nums: false,
letters: false,
upper: false,
safe_sp_chars: true,
unsafe_sp_chars: false,
};
let result = test_key_from_opts(opts, FunctionType::SpecialChars);
if !result {
panic!("SpecialChars contained an invalid character.");
}
}
#[test]
fn test_correct_characters_special_chars_unsafe() {
let opts = GenCharOpts {
nums: false,
letters: false,
upper: false,
safe_sp_chars: false,
unsafe_sp_chars: true,
};
let result = test_key_from_opts(opts, FunctionType::SpecialCharsUnsafe);
if !result {
panic!("SpecialCharsUnsafe contained an invalid character.");
}
}
}