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
// SPDX-License-Identifier: MPL-2.0

//! This crate provides a derive macro named TryFromInt. This macro can be used to automatically implement TryFrom trait
//! for [C-like enums](https://doc.rust-lang.org/stable/rust-by-example/custom_types/enum/c_like.html).
//!
//! Currently, this macro only supports enums with [explicit discriminants](https://doc.rust-lang.org/reference/items/enumerations.html#explicit-discriminants).
//!
//! Below is a simple example. We derive macro `TryFromInt` for an enum `Color`.
//! ```rust
//! use int_to_c_enum::TryFromInt;
//! #[repr(u8)]
//! #[derive(TryFromInt, Eq, PartialEq)]
//! pub enum Color {
//!     Red = 1,
//!     Yellow = 2,
//!     Blue = 3,
//! }
//! // Then, we can use method `try_from` for `Color`.
//! let color = Color::try_from(1).unwrap();
//! assert!(color == Color::Red);
//! ```
//!
//! The `TryFromInt` macro will automatically implement trait `TryFrom<u8>` for `Color`.
//! After macro expansion, the generated code looks like as follows:
//! ```ignore
//! impl TryFrom<u8> for Color {
//!     type Error = TryFromIntError;
//!     fn try_from(value: u8) -> Result<Self, Self::Error> {
//!         match value {
//!             1 => Ok(Color::Red),
//!             2 => Ok(Color::Yellow),
//!             3 => Ok(Color::Blue),
//!             _ => Err(TryFromIntError::InvalidValue),
//!         }
//!     }
//! }
//! ```
//!

#![cfg_attr(not(test), no_std)]

/// Error type for TryFromInt derive macro
#[derive(Debug, Clone, Copy)]
pub enum TryFromIntError {
    InvalidValue,
}

#[cfg(feature = "derive")]
pub use int_to_c_enum_derive::TryFromInt;