use crate::__internal::Private;
use std::{
error::Error,
fmt::{Debug, Display},
marker::PhantomData,
};
pub unsafe trait Enum: TryFrom<i32> {
const NAME: &'static str;
fn is_known(value: i32) -> bool;
}
pub struct UnknownEnumValue<T>(i32, PhantomData<T>);
impl<T> UnknownEnumValue<T> {
#[doc(hidden)]
pub fn new(_private: Private, unknown_value: i32) -> Self {
Self(unknown_value, PhantomData)
}
}
impl<T> Debug for UnknownEnumValue<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_tuple("UnknownEnumValue").field(&self.0).finish()
}
}
impl<T: Enum> Display for UnknownEnumValue<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let val = self.0;
let enum_name = T::NAME;
write!(f, "{val} is not a known value for {enum_name}")
}
}
impl<T: Enum> Error for UnknownEnumValue<T> {}