primitive_enum/
lib.rs

1#![cfg_attr(not(feature = "std"), no_std)]
2pub use primitive_enum_derive::{FromU8, PrimitiveFromEnum};
3#[cfg(feature = "std")]
4use std::{error::Error, fmt};
5
6/**
7Need for complex Enums, which includes other data:
8```
9use primitive_enum::{PrimitiveFromEnum, FromU8};
10
11#[derive(PrimitiveFromEnum)]
12#[primitive(Primitive)]
13enum Complex {
14    A(String),
15    B(u32),
16    C
17}
18#[derive(FromU8, Clone, Copy)]
19#[repr(u8)]
20enum Primitive {
21    A,
22    B,
23    C,
24}
25```
26PrimitiveEnum should be equivalent for Complex, but without variants inner data
27 */
28pub trait PrimitiveFromEnum {
29    type PrimitiveEnum: TryFrom<u8> + UnsafeFromU8;
30
31    fn get_primitive_enum(&self) -> Self::PrimitiveEnum;
32
33    /// get primitive enum name in string format
34    fn primitive_name() -> &'static str;
35}
36
37pub trait UnsafeFromU8: PartialEq<u8> + Sized {
38    /// # Safety
39    ///
40    /// This function is unsafe because there is no guarantee that the value is valid
41    unsafe fn from_unsafe(_: u8) -> Self;
42
43    // get enum name in string format
44    fn name() -> &'static str;
45}
46
47#[cfg_attr(feature = "std", derive(Debug))]
48pub struct EnumFromU8Error;
49
50#[cfg(feature = "std")]
51impl fmt::Display for EnumFromU8Error {
52    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
53        write!(f, "EnumFromU8Error")
54    }
55}
56
57#[cfg(feature = "std")]
58impl Error for EnumFromU8Error {}