nexus_bits/lib.rs
1//! Bit field packing for integer IDs.
2//!
3//! `nexus-bits` provides ergonomic bit field manipulation for packing
4//! multiple values into integers - common in trading systems for
5//! instrument IDs, order IDs, and wire protocols.
6//!
7//! # Example
8//!
9//! ```
10//! use nexus_bits::{BitField, Flag};
11//!
12//! // Define layout
13//! const KIND: BitField<u64> = BitField::<u64>::new(0, 4);
14//! const EXCHANGE: BitField<u64> = BitField::<u64>::new(4, 8);
15//! const SYMBOL: BitField<u64> = BitField::<u64>::new(12, 20);
16//! const IS_TEST: Flag<u64> = Flag::<u64>::new(63);
17//!
18//! // Pack
19//! let mut id: u64 = 0;
20//! id = KIND.set(id, 1).unwrap();
21//! id = EXCHANGE.set(id, 5).unwrap();
22//! id = SYMBOL.set(id, 12345).unwrap();
23//! id = IS_TEST.set(id);
24//!
25//! // Unpack
26//! assert_eq!(KIND.get(id), 1);
27//! assert_eq!(EXCHANGE.get(id), 5);
28//! assert_eq!(SYMBOL.get(id), 12345);
29//! assert!(IS_TEST.is_set(id));
30//! ```
31
32#![no_std]
33#![warn(missing_docs)]
34
35mod error;
36mod field;
37mod flag;
38mod int_enum;
39
40pub use error::{FieldOverflow, Overflow, UnknownDiscriminant};
41pub use field::BitField;
42pub use flag::Flag;
43pub use int_enum::IntEnum;
44
45#[cfg(feature = "derive")]
46pub use nexus_bits_derive::{IntEnum, bit_storage};