intid-derive 0.3.9

Procedural macros for the intid crate (prefer re-exports in intid)
Documentation
#![allow(missing_docs)]

#[derive(Copy, Clone, Debug, Eq, PartialEq, intid_derive::IntegerId, intid_derive::EnumId)]
pub enum Letter {
    A,
    B,
    C,
}

#[derive(Copy, Clone, Debug, Eq, PartialEq, intid_derive::IntegerId)]
pub struct Plain(u64);

#[derive(
    Copy, Clone, Debug, Eq, PartialEq, intid_derive::IntegerId, intid_derive::IntegerIdCounter,
)]
pub struct Counter(u32);

#[derive(Copy, Clone, Debug, Eq, PartialEq, intid_derive::IntegerId, intid_derive::EnumId)]
enum Void {}

#[test]
fn verify_derive() {
    assert_id::<Letter>();
    assert_id::<Plain>();
    assert_id::<Void>();
    assert_counter::<Counter>();
    assert_enum::<Letter>();
    assert_enum::<Void>();
}

fn assert_id<T: intid::IntegerId>() {}
fn assert_contiguous<T: intid::IntegerIdContiguous>() {
    assert_id::<T>();
}
fn assert_counter<T: intid::IntegerIdCounter>() {
    assert_contiguous::<T>();
    assert_eq!(T::START.to_int(), T::START_INT);
}
fn assert_enum<T: intid::EnumId>() {
    use intid::array::Array;
    assert_id::<T>();
    assert_eq!(
        T::Array::<()>::LEN,
        T::MAX_ID_INT.map_or(0, |x| primint::to_usize_checked(x).unwrap() + 1)
    );
}