id-forge 1.0.0

Typed, high-performance unique ID generation for Rust. UUID v4/v7, ULID, Snowflake, NanoID, and custom epoch-based schemes in one zero-dependency library. Monotonic, distributed-safe, sortable variants.
Documentation
use id_forge::nanoid;
use id_forge::snowflake::Snowflake;
use id_forge::ulid::Ulid;
use id_forge::uuid::Uuid;

#[test]
fn smoke_uuid_v4() {
    let id = Uuid::v4();
    assert_eq!(id.to_string().len(), 36);
}

#[test]
fn smoke_uuid_v7() {
    let id = Uuid::v7();
    assert_eq!(id.to_string().len(), 36);
}

#[test]
fn smoke_uuid_unique() {
    assert_ne!(Uuid::v4(), Uuid::v4());
}

#[test]
fn smoke_ulid_length() {
    assert_eq!(Ulid::new().to_string().len(), 26);
}

#[test]
fn smoke_ulid_unique() {
    assert_ne!(Ulid::new(), Ulid::new());
}

#[test]
fn smoke_ulid_monotonic() {
    let a = Ulid::new();
    let b = Ulid::new();
    assert!(b > a);
}

#[test]
fn smoke_ulid_roundtrip() {
    let id = Ulid::new();
    assert_eq!(Ulid::parse_str(&id.to_string()).unwrap(), id);
}

#[test]
fn smoke_snowflake_unique() {
    let gen = Snowflake::new(1);
    assert_ne!(gen.next_id(), gen.next_id());
}

#[test]
fn smoke_snowflake_worker_extracts() {
    let gen = Snowflake::new(42);
    let id = gen.next_id();
    let (_, worker, _) = Snowflake::parts(id);
    assert_eq!(worker, 42);
}

#[test]
fn smoke_snowflake_try_next_id_ok() {
    let gen = Snowflake::new(1);
    let id = gen.try_next_id().expect("clock should advance");
    assert!(id > 0);
}

#[test]
fn smoke_snowflake_monotonic_burst() {
    let gen = Snowflake::new(1);
    let mut prev = gen.next_id();
    for _ in 0..5_000 {
        let cur = gen.next_id();
        assert!(cur > prev);
        prev = cur;
    }
}

#[test]
fn smoke_nanoid_default() {
    let id = nanoid::generate();
    assert_eq!(id.len(), 21);
}

#[test]
fn smoke_nanoid_custom_length() {
    let id = nanoid::with_length(8);
    assert_eq!(id.len(), 8);
}

#[test]
fn smoke_nanoid_custom_alphabet() {
    let id = nanoid::custom(16, b"01");
    assert!(id.chars().all(|c| c == '0' || c == '1'));
}

#[test]
fn smoke_nanoid_try_custom_ok() {
    let id = nanoid::try_custom(12, b"0123456789").unwrap();
    assert_eq!(id.len(), 12);
    assert!(id.chars().all(|c| c.is_ascii_digit()));
}

#[test]
fn smoke_nanoid_try_custom_rejects_duplicate() {
    assert!(nanoid::try_custom(8, b"aabb").is_err());
}