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}