use core::fmt;
use core::ops::Deref;
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(transparent)]
pub struct ColorId(pub u16);
impl ColorId {
#[inline]
pub const fn index(self) -> u16 {
self.0
}
}
impl From<u16> for ColorId {
#[inline]
fn from(v: u16) -> Self {
Self(v)
}
}
impl From<usize> for ColorId {
#[inline]
fn from(v: usize) -> Self {
Self(v as u16)
}
}
impl From<i32> for ColorId {
#[inline]
fn from(v: i32) -> Self {
Self(if v < 0 {
0
} else if v > 255 {
255
} else {
v as u16
})
}
}
impl fmt::Debug for ColorId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
impl fmt::Display for ColorId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
macro_rules! impl_partial_eq {
($t:ty) => {
impl PartialEq<$t> for ColorId {
#[inline]
fn eq(&self, other: &$t) -> bool {
self.0 as $t == *other
}
}
};
}
impl PartialEq<u16> for ColorId {
#[inline]
fn eq(&self, other: &u16) -> bool {
self.0 == *other
}
}
impl_partial_eq!(i32);
impl_partial_eq!(usize);
impl Deref for ColorId {
type Target = u16;
#[inline]
fn deref(&self) -> &u16 {
&self.0
}
}
pub const DEFAULT_FG_ID: ColorId = ColorId(256);
pub const DEFAULT_BG_ID: ColorId = ColorId(257);