| Crates.io | complex-enum-macros |
| lib.rs | complex-enum-macros |
| version | 0.2.3 |
| created_at | 2024-11-06 11:03:52.03287+00 |
| updated_at | 2025-07-10 07:40:45.096358+00 |
| description | Convert enums with non-unit variants to privitives and back |
| homepage | |
| repository | https://github.com/okhsunrog/complex-enum-macros |
| max_upload_size | |
| id | 1438103 |
| size | 25,300 |
A Rust procedural macro for deriving code/discriminant conversion methods for enums, supporting both unit and complex variants.
try_from_code()Add this to your Cargo.toml:
[dependencies]
complex-enum-macros = "0.2"
use complex_enum_macros::{ToCode, TryFromCode};
#[derive(ToCode, TryFromCode, Debug, PartialEq)]
#[repr(u8)]
pub enum I2cCommand {
Uptime = 0x00,
AdcStats = 0x01,
SampleRate { rate: Option<u32> } = 0x02,
GoertThreshold { threshold: Option<u16> } = 0x03,
Reset = 0x06,
// Variants without explicit discriminants are also supported
Scan,
WavStart,
}
fn main() {
// Convert enum to code
let cmd = I2cCommand::Uptime;
assert_eq!(cmd.to_code(), Some(0x00));
let cmd = I2cCommand::SampleRate { rate: Some(1000) };
assert_eq!(cmd.to_code(), Some(0x02));
// Create enum from code
let cmd = I2cCommand::try_from_code(0x03).unwrap();
assert!(matches!(cmd, I2cCommand::GoertThreshold { .. }));
// Invalid codes return None
assert_eq!(I2cCommand::try_from_code(0xFF), None);
// Variants without explicit discriminants return None for to_code()
let cmd = I2cCommand::Scan;
assert_eq!(cmd.to_code(), None);
}