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;