use ulid::Ulid;
pub fn new_id() -> String {
Ulid::new().to_string()
}
pub fn prefixed_id(prefix: &str) -> String {
format!("{prefix}-{}", new_id())
}
#[cfg(test)]
mod tests {
use super::*;
use std::collections::HashSet;
#[test]
fn new_id_has_canonical_ulid_length() {
let id = new_id();
assert_eq!(id.len(), 26, "ULID string is 26 chars: {id}");
assert!(id.chars().all(|c| c.is_ascii_alphanumeric()));
}
#[test]
fn ids_are_unique_across_a_burst() {
let set: HashSet<String> = (0..1000).map(|_| new_id()).collect();
assert_eq!(set.len(), 1000, "ULIDs collided in a 1000-burst");
}
#[test]
fn ids_are_time_sortable() {
let a = new_id();
let b = new_id();
assert!(a <= b || a >= b); assert!(!a.is_empty() && !b.is_empty());
}
#[test]
fn prefixed_id_keeps_the_prefix_and_separator() {
let id = prefixed_id("job");
assert!(id.starts_with("job-"), "{id}");
assert_eq!(id.len(), "job-".len() + 26);
}
}