| Crates.io | enum-repr-conv |
| lib.rs | enum-repr-conv |
| version | 0.1.0 |
| created_at | 2025-11-22 13:19:46.202035+00 |
| updated_at | 2025-11-22 13:19:46.202035+00 |
| description | enum_repr_conv is a proc-macro library that provides a convenient attribute-style `repr_conv()` macro to specify a primitive integer type used for representing variants of the annotated fieldless enum as values of this type. |
| homepage | |
| repository | https://sourcecraft.dev/argenet/enum-repr-conv |
| max_upload_size | |
| id | 1945321 |
| size | 27,860 |
enum_repr_conv is a proc-macro library that provides a convenient attribute-style repr_conv() macro to specify a primitive integer type used for representing variants of the annotated fieldless enum as values of this type.
enum_repr_conv bridges the gap between C-style enums and fieldless enums in Rust that can be represented using a chosen primitive integer type. It implements conversions from enum variants into integer values (infallible through std::convert::From) and vice versa (fallible through std::convert::TryFrom).
This functionality is provided via repr_conv(<type>) macro that mimics the syntax and behavior of repr(u*)/repr(i*) data layout attributes but additionally provides practical and sensible implementations of common conversion traits.
use enum_repr_conv::repr_conv;
#[repr_conv(u16)]
#[derive(Debug, PartialEq, Eq)]
enum SupportedPorts {
FTP = 21,
SSH, // = 22
HTTP = 80,
HTTPS = 443,
}
// we can get a u16 for the FTP port easily...
assert_eq!(u16::from(SupportedPorts::FTP), 21);
//... and for the SSH port too
assert_eq!(u16::from(SupportedPorts::SSH), 22);
// HTTP port is supported and so conversion succeeds
assert_eq!(SupportedPorts::try_from(80).unwrap(), SupportedPorts::HTTP);
// Gopher is not supported; who needs it in 2025?!
assert!(SupportedPorts::try_from(70).is_err());
Licensed under Boost Software License, Version 1.0.