pub const DEFAULT_NANOID_LEN: usize = 21;
pub fn nanoid() -> String {
nanoid::nanoid!()
}
pub fn nanoid_with_len(len: usize) -> String {
nanoid::nanoid!(len)
}
pub fn nanoid_with_alphabet(len: usize, alphabet: &[char]) -> String {
nanoid::nanoid!(len, alphabet)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_length() {
let id = nanoid();
assert_eq!(id.len(), DEFAULT_NANOID_LEN);
}
#[test]
fn custom_length() {
for len in [4_usize, 10, 32, 64] {
assert_eq!(nanoid_with_len(len).len(), len);
}
}
#[test]
fn url_safe_alphabet_by_default() {
let id = nanoid_with_len(64);
assert!(
id.chars()
.all(|c| c.is_ascii_alphanumeric() || c == '_' || c == '-'),
"unexpected chars in {id}"
);
}
#[test]
fn custom_alphabet_respects_alphabet() {
let alphabet = ['x', 'y', 'z'];
let id = nanoid_with_alphabet(50, &alphabet);
assert_eq!(id.len(), 50);
assert!(id.chars().all(|c| alphabet.contains(&c)));
}
}