1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
[](https://gitlab.com/cardoe/enum-primitive-derive/commits/master)
[]()
[](https://docs.rs/enum-primitive-derive)
[](https://crates.io/crates/enum-primitive-derive)
[](https://crates.io/crates/enum-primitive-derive)
[](https://crates.io/crates/enum-primitive-derive)
This is a custom derive, using procedural macros, implementation of
[enum_primitive](https://crates.io/crates/enum_primitive).
MSRV is 1.34.0
## Documentation
[https://docs.rs/enum-primitive-derive/](https://docs.rs/enum-primitive-derive/)
## Usage
Add the following to `Cargo.toml`:
```
[dependencies]
enum-primitive-derive = "^0.1"
num-traits = "^0.1"
```
Then to your code add:
```rust
#[macro_use]
extern crate enum_primitive_derive;
extern crate num_traits;
#[derive(Primitive)]
enum Variant {
Value = 1,
Another = 2,
}
```
To be really useful you need `use num_traits::FromPrimitive` or
`use num_traits::ToPrimitive` or both. You will then be able to
use
[num_traits::FromPrimitive](https://rust-num.github.io/num/num/trait.FromPrimitive.html)
and/or
[num_traits::ToPrimitive](https://rust-num.github.io/num/num/trait.ToPrimitive.html)
on your enum.
## Full Example
```rust
#[macro_use]
extern crate enum_primitive_derive;
extern crate num_traits;
use num_traits::{FromPrimitive, ToPrimitive};
#[derive(Primitive)]
enum Foo {
Bar = 32,
Dead = 42,
Beef = 50,
}
fn main() {
assert_eq!(Foo::from_i32(32), Some(Foo::Bar));
assert_eq!(Foo::from_i32(42), Some(Foo::Dead));
assert_eq!(Foo::from_i64(50), Some(Foo::Beef));
assert_eq!(Foo::from_isize(17), None);
let bar = Foo::Bar;
assert_eq!(bar.to_i32(), Some(32));
let dead = Foo::Dead;
assert_eq!(dead.to_isize(), Some(42));
}
```
# Complex Example
In this case we attempt to use values created by
[bindgen](https://crates.io/crates/bindgen).
```rust
#[macro_use]
extern crate enum_primitive_derive;
extern crate num_traits;
use num_traits::{FromPrimitive, ToPrimitive};
pub const ABC: ::std::os::raw::c_uint = 1;
pub const DEF: ::std::os::raw::c_uint = 2;
pub const GHI: ::std::os::raw::c_uint = 4;
#[derive(Clone, Copy, Debug, Eq, PartialEq, Primitive)]
enum BindGenLike {
ABC = ABC as isize,
DEF = DEF as isize,
GHI = GHI as isize,
}
fn main() {
assert_eq!(BindGenLike::from_isize(4), Some(BindGenLike::GHI));
assert_eq!(BindGenLike::from_u32(2), Some(BindGenLike::DEF));
assert_eq!(BindGenLike::from_u32(8), None);
let abc = BindGenLike::ABC;
assert_eq!(abc.to_u32(), Some(1));
}
```
|