devela/examples/code/enumset.rs
1// devela::examples::code::enumset
2//
3//! Shows how to use the [`enumset!`] declarative macro.
4//!
5//! # Examples
6//!
7//! This will create the [`ExampleEnum`] and [`ExampleEnumSet`] interrelated types.
8//! ```
9//! # use devela::enumset;
10//! enumset! {
11//! /// An example created with [`enumset!`].
12//! #[allow(dead_code)]
13//! #[derive(Clone, Default)]
14//! #[repr(u64)]
15//! pub enum ExampleEnum<'a, 'b, T>(
16//! /// Represents a set of [`ExampleEnum`] variants.
17//! pub ExampleEnumSet: u8
18//! )
19//! [where T: Clone] // supports where clauses (between [])
20//! {
21//! #[default]
22//! Variant0 = 1,
23//! /// A tuple variant.
24//! Variant1([u8; 3]),
25//! /// A self-referential tuple variant.
26//! #[cfg(feature = "std")]
27//! Variant2(Box<Self>),
28//! /// A struct variant with discriminant.
29//! Variant3 {
30//! /// field1 docs.
31//! some: [u8; 2],
32//! /// field2 docs.
33//! other: u32
34//! } = 30,
35//! /// Supports generics and lifetimes.
36//! Variant4(T, &'a str, &'b u32),
37//! }
38//! }
39//!
40//! assert_eq![5, ExampleEnum::<()>::ENUM_VARIANTS];
41//! ```
42//
43
44use devela::enumset;
45
46enumset! {
47 /// An example created with [`enumset!`].
48 #[allow(dead_code)]
49 #[derive(Clone, Default)]
50 #[repr(u64)]
51 pub enum ExampleEnum<'a, 'b, T>(
52 /// Represents a set of [`ExampleEnum`] variants.
53 pub ExampleEnumSet: u8
54 )
55 [where T: Clone] // supports where clauses (between [])
56 {
57 /// A default unit variant.
58 #[default]
59 Variant0 = 1,
60 /// A tuple variant.
61 Variant1([u8; 3]),
62 /// A self-referential tuple variant.
63 #[cfg(feature = "std")]
64 Variant2(Box<Self>),
65 /// A struct variant with discriminant.
66 Variant3 {
67 /// field1 docs.
68 some: [u8; 2],
69 /// field2 docs.
70 other: u32
71 } = 30,
72 /// Supports generics and lifetimes.
73 Variant4(T, &'a str, &'b u32),
74 }
75}
76
77fn main() {
78 let v1 = ExampleEnum::<()>::Variant1([3, 2, 1]);
79 let _es = ExampleEnum::<()>::new_empty_set();
80
81 assert_eq![ExampleEnum::<()>::ENUM_VARIANTS, 5];
82 assert_eq![v1.enum_variants(), 5];
83}