const ALPHABET: &[u8; 64] = b"_-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
const DEFAULT_LEN: usize = 21;
pub fn generate() -> String {
generate_with_len(DEFAULT_LEN)
}
pub fn generate_with_len(len: usize) -> String {
std::iter::repeat_with(|| {
let idx = fastrand::usize(..ALPHABET.len());
ALPHABET.get(idx).copied().unwrap_or(b'_') as char
})
.take(len)
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_length_and_alphabet() {
let id = generate();
assert_eq!(id.len(), DEFAULT_LEN);
assert!(id.bytes().all(|b| ALPHABET.contains(&b)));
}
#[test]
fn ids_are_unique() {
let a = generate();
let b = generate();
assert_ne!(a, b);
}
#[test]
fn custom_length() {
assert_eq!(generate_with_len(8).len(), 8);
}
}