repr_fits 0.1.0

Compile-time bit-width checks for enum discriminants.
Documentation
  • Coverage
  • 100%
    2 out of 2 items documented1 out of 1 items with examples
  • Size
  • Source code size: 11.87 kB This is the summed size of all the files inside the crates.io package for this release.
  • Documentation size: 284.68 kB This is the summed size of all files generated by rustdoc for all configured targets
  • Ø build duration
  • this release: 11s Average build duration of successful builds.
  • all releases: 11s Average build duration of successful builds in releases after 2024-10-23.
  • Links
  • HaveFunTrading/repr_fits
    0 0 0
  • crates.io
  • Dependencies
  • Versions
  • Owners
  • HaveFunTrading

Build Status Crates.io Documentation License: MIT

Overview

repr_fits provides a small attribute macro for checking that enum discriminants fit into a fixed number of bits.

This is useful when an enum is stored inside a compact protocol field, packed integer id, file format, or wire representation where Rust's normal #[repr(u8)] is too wide. Rust does not have #[repr(u5)], so repr_fits lets you keep a normal enum definition while adding compile-time bit-width checks.

Example

use repr_fits::repr_fits;

#[repr_fits(bits = 5)]
#[repr(u8)]
enum RegionCode {
    Local = 0,
    Remote = 1,
    Backup = 4,
}

The enum remains a normal Rust enum. The macro only appends compile-time assertions for each variant:

assert!((RegionCode::Local as u128) < (1u128 << 5));
assert!((RegionCode::Remote as u128) < (1u128 << 5));
assert!((RegionCode::Backup as u128) < (1u128 << 5));

If a discriminant does not fit, compilation fails with a message naming the offending variant:

use repr_fits::repr_fits;

#[repr_fits(bits = 2)]
#[repr(u8)]
enum PacketKind {
    Data = 0,
    Ack = 1,
    Control = 4,
}

The generated assertion message is shaped like:

PacketKind::Control discriminant does not fit in 2 bits

Why not just use #[repr(u8)]?

#[repr(u8)] guarantees that discriminants fit in 8 bits. It does not help when the packed representation reserves fewer bits, such as:

5 bits  region code
2 bits  packet kind
25 bits sequence id

repr_fits documents and enforces that smaller bit budget at compile time.

Limitations

  • Supports enum items only.
  • Supports unit variants only.
  • The macro checks discriminants by casting variants in a generated const assertion block, so the enum must be castable to an integer. In practice, use a primitive representation such as #[repr(u8)].

License

MIT