use colored::*;
use rand::distributions::Alphanumeric;
use rand::prelude::*;
use rand::seq::SliceRandom;
use rand::thread_rng;
use zxcvbn::zxcvbn;
fn gen_random_u32(min: u32, max: u32) -> u32 {
thread_rng().gen_range(min..=max)
}
fn gen_random_f64(min: f64, max: f64, decimal_places: u32) -> f64 {
let mut rng = rand::thread_rng();
let rand_num = rng.gen_range(min..=max);
let factor = 10f64.powi(decimal_places as i32);
((rand_num * factor).round() / factor)
}
fn gen_random_string(len: usize) -> String {
rand::thread_rng()
.sample_iter(&Alphanumeric)
.take(len)
.map(char::from)
.collect()
}
const LOWERCASE_CHARS: &str = "abcdefghijklmnopqrstuvwxyz";
const UPPERCASE_CHARS: &str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const NUMERIC_CHARS: &str = "0123456789";
const SPECIAL_CHARS: &str = "!@#$%^&*()-_=+[{]};:,<.>/?";
pub fn gen_password(len: usize, complexity: &str) -> String {
let mut rng = thread_rng();
let mut all_chars: Vec<char> = Vec::with_capacity(len);
match complexity {
"s" => {
all_chars.extend(LOWERCASE_CHARS.chars());
all_chars.extend(NUMERIC_CHARS.chars());
}
"m" => {
all_chars.extend(LOWERCASE_CHARS.chars());
all_chars.extend(UPPERCASE_CHARS.chars());
all_chars.extend(NUMERIC_CHARS.chars());
}
"c" => {
all_chars.extend(LOWERCASE_CHARS.chars());
all_chars.extend(UPPERCASE_CHARS.chars());
all_chars.extend(NUMERIC_CHARS.chars());
all_chars.extend(SPECIAL_CHARS.chars());
}
_ => panic!("Invalid complexity level: {}", complexity),
}
(0..len)
.map(|_| *all_chars.choose(&mut rng).unwrap())
.collect()
}
fn evaluate_password_strength(password: &str) -> u8 {
let result = zxcvbn(password, &[]);
result.score().into()
}
pub fn print_password_strength(password: &str) {
let score = evaluate_password_strength(password);
print!("Strength:");
match score {
0 => println!("{}", "■■■■■■■■".red()), 1 => println!("{}", "■■■■■■■■■■■■■".magenta()), 2 => println!("{}", "■■■■■■■■■■■■■■■■■■■■".yellow()), 3 => println!("{}", "■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■".cyan()), 4 => println!("{}", "■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■".green()), _ => unreachable!(), }
}