#![cfg_attr(not(test), no_std)]
use thiserror::Error;
#[doc(hidden)]
#[path = "private.rs"]
pub mod __private;
#[doc(inline)]
pub use macros::ffi_enum;
pub mod prelude {
pub use crate::{ffi_enum, FfiEnum as _, FfiEnumExt as _};
}
pub trait FfiEnum: Copy + Eq {
type Enum: TryFrom<Self, Error = Error> + Into<Self>;
type Repr: Copy + From<Self> + Into<Self>;
}
pub trait FfiEnumExt: FfiEnum {
fn is_known(self) -> bool;
fn repr(self) -> Self::Repr;
fn into_enum(self) -> Self::Enum;
}
impl<T: FfiEnum> FfiEnumExt for T {
#[inline(always)]
fn is_known(self) -> bool {
Self::Enum::try_from(self).is_ok()
}
#[inline(always)]
fn repr(self) -> Self::Repr {
self.into()
}
#[inline(always)]
fn into_enum(self) -> Self::Enum {
self.try_into().unwrap()
}
}
#[derive(Debug, Error, Clone, Copy, PartialEq, Eq)]
pub enum Error {
#[error("value of ffi_enum type is an unknown variant")]
UnknownVariant,
#[error(transparent)]
TryFromInt(#[from] core::num::TryFromIntError),
}