#[derive(Clone, Copy, PartialEq)]
pub enum Ident<T, Repr> {
Known(T),
Reserved(Repr),
}
impl<T, Repr> From<T> for Ident<T, Repr> {
fn from(value: T) -> Self {
Self::Known(value)
}
}
#[cfg(feature = "std")]
mod std_impls {
use super::*;
use std::fmt::{self, Debug, UpperHex};
impl<T, Repr> Debug for Ident<T, Repr>
where
T: Clone + Copy + PartialEq + Debug,
Repr: Clone + Copy + PartialEq + Debug + UpperHex,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Known(id) => id.fmt(f),
Self::Reserved(id) => f
.debug_tuple("Reserved")
.field(
&format_args!("{:#04X}", id),
)
.finish(),
}
}
}
}
impl<T, Repr> Ident<T, Repr>
where
T: TryFrom<Repr>,
Repr: Clone + Copy,
{
pub fn from_integer(value: Repr) -> Self {
match T::try_from(value) {
Ok(id) => Self::Known(id),
Err(_) => Self::Reserved(value),
}
}
}
impl<T> Ident<T, u8>
where
T: Into<u8>,
{
pub fn to_integer(self) -> u8 {
match self {
Ident::Known(id) => id.into(),
Ident::Reserved(id) => id,
}
}
}
impl<T> Ident<T, u16>
where
T: Into<u16>,
{
pub fn to_integer(self) -> u16 {
match self {
Ident::Known(id) => id.into(),
Ident::Reserved(id) => id,
}
}
}