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
#![cfg_attr(not(feature = "std"), no_std)]
pub use primitive_enum_derive::{FromU8, PrimitiveFromEnum};
#[cfg(feature = "std")]
use std::{error::Error, fmt};
/**
Need for complex Enums, which includes other data:
```
use primitive_enum::{PrimitiveFromEnum, FromU8};
#[derive(PrimitiveFromEnum)]
#[primitive(Primitive)]
enum Complex {
A(String),
B(u32),
C
}
#[derive(FromU8, Clone, Copy)]
#[repr(u8)]
enum Primitive {
A,
B,
C,
}
```
PrimitiveEnum should be equivalent for Complex, but without variants inner data
*/
pub trait PrimitiveFromEnum {
type PrimitiveEnum: TryFrom<u8> + UnsafeFromU8;
fn get_primitive_enum(&self) -> Self::PrimitiveEnum;
/// get primitive enum name in string format
fn primitive_name() -> &'static str;
}
pub trait UnsafeFromU8: PartialEq<u8> + Sized {
/// # Safety
///
/// This function is unsafe because there is no guarantee that the value is valid
unsafe fn from_unsafe(_: u8) -> Self;
// get enum name in string format
fn name() -> &'static str;
}
#[cfg_attr(feature = "std", derive(Debug))]
pub struct EnumFromU8Error;
#[cfg(feature = "std")]
impl fmt::Display for EnumFromU8Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "EnumFromU8Error")
}
}
#[cfg(feature = "std")]
impl Error for EnumFromU8Error {}