use rand::{distributions::Alphanumeric, thread_rng, Rng};
fn alphanum(length: u8) -> String {
let mut rng = thread_rng();
(0..length)
.filter_map(|_| -> Option<char> { rng.sample(Alphanumeric).try_into().ok() })
.collect()
}
fn pin(length: u8) -> String {
let mut rng = thread_rng();
(0..length)
.filter_map(|_| -> Option<char> { rng.gen_range(b'0'..=b'9').try_into().ok() })
.collect()
}
fn everything(length: u8) -> String {
let mut rng = thread_rng();
(0..length)
.filter_map(|_| -> Option<char> { rng.gen_range(b'!'..=b'~').try_into().ok() })
.collect()
}
#[inline]
#[must_use]
pub fn generate(option: &str, length: u8) -> String {
match option {
"pin" => pin(length),
"full" => everything(length),
&_ => alphanum(length),
}
}
#[cfg(test)]
mod tests;