use ulid::Ulid;
pub(crate) fn new_ulid() -> String {
Ulid::new().to_string()
}
pub(crate) fn parse(s: &str) -> Result<Ulid, ulid::DecodeError> {
Ulid::from_string(s)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn new_ulid_is_26_chars_crockford_base32() {
let id = new_ulid();
assert_eq!(id.len(), 26);
for c in id.chars() {
assert!(
c.is_ascii_digit() || (c.is_ascii_uppercase() && !"ILOU".contains(c)),
"non-Crockford char {c:?} in ULID {id:?}"
);
}
}
#[test]
fn parse_round_trip() {
let id = new_ulid();
let parsed = parse(&id).expect("our own ULID must parse");
assert_eq!(parsed.to_string(), id);
}
#[test]
fn ulids_are_distinct_within_process() {
let mut seen = std::collections::HashSet::new();
for _ in 0..100 {
let id = new_ulid();
assert!(seen.insert(id), "ULID collision");
}
}
}