File: README.md

package info (click to toggle)
rust-enum-unitary 0.5.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 140 kB
  • sloc: sh: 5; makefile: 4
file content (51 lines) | stat: -rw-r--r-- 1,504 bytes parent folder | download
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
# `enum-unitary`

> Trait and macro for unitary enums

[Documentation](https://docs.rs/enum-unitary)

The `EnumUnitary` trait carries a number of constraints for primitive
conversions iterating over variants of a unitary enum (i.e. enum variants do not
have payloads).

The `enum_unitary!` macro defines a new enum implementing `EnumUnitary` and
required traits.

## Usage

For the macro to derive `Sequence`, the `enum-iterator` crate must also be added
to `Cargo.toml`:
```toml
enum-iterator = "1.0"
enum-unitary = "0.5"
```

Define a unitary enum:
```rust
use enum_unitary::{enum_unitary, EnumUnitary, FromPrimitive, ToPrimitive};

enum_unitary! {
  #[derive(Debug, PartialEq)]
  pub enum E {
    A, B, C
  }
}

assert_eq!(enum_iterator::cardinality::<E>(), 3);
assert_eq!(Into::<usize>::into (E::A), 0);
assert_eq!(Into::<usize>::into (E::B), 1);
assert_eq!(Into::<usize>::into (E::C), 2);
assert_eq!(enum_iterator::first::<E>().unwrap(), E::A);
assert_eq!(enum_iterator::last::<E>().unwrap(),  E::C);
let mut i = enum_iterator::all::<E>();
assert_eq!(i.next(), Some (E::A));
assert_eq!(i.next(), Some (E::B));
assert_eq!(i.next(), Some (E::C));
assert_eq!(i.next(), None);
assert_eq!(enum_iterator::next (&E::A), Some (E::B));
assert_eq!(enum_iterator::previous (&E::A), None);
assert_eq!(enum_iterator::next (&E::B), Some (E::C));
assert_eq!(enum_iterator::previous (&E::B), Some (E::A));
assert_eq!(enum_iterator::next (&E::C), None);
assert_eq!(enum_iterator::previous (&E::C), Some (E::B));
```