use crate::__internal::Private;
use std::{
error::Error,
fmt::{Debug, Display},
marker::PhantomData,
};
use crate::__internal::SealedInternal;
use crate::codegen_traits::{entity_tag, EntityType};
use crate::{Proxied, Singular};
pub unsafe trait Enum:
TryFrom<i32>
+ Into<i32>
+ Copy
+ for<'a> Proxied<View<'a> = Self>
+ EntityType<Tag = entity_tag::EnumTag>
+ Singular
+ SealedInternal
{
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> {}