use crate::{
utils::is_valid_role,
RoleError,
RoleVariant,
};
#[derive(Debug, Copy, Clone)]
pub enum RoleValue<T>
where
T: RoleVariant,
{
Role(T),
Raw(usize),
}
impl<T> RoleValue<T>
where
T: RoleVariant,
{
pub fn from_role(role: T) -> Self {
RoleValue::Role(role)
}
pub fn try_from_role(role: T) -> Result<Self, RoleError> {
is_valid_role(role.into())
.then_some(RoleValue::Role(role))
.ok_or(RoleError::InvalidRole(role.into()))
}
pub fn from_usize(value: usize) -> Self {
RoleValue::Raw(value)
}
pub fn try_from_usize(value: usize) -> Result<Self, RoleError> {
is_valid_role(value)
.then_some(RoleValue::Raw(value))
.ok_or(RoleError::InvalidRole(value))
}
}
impl<T> From<RoleValue<T>> for usize
where
T: RoleVariant,
{
fn from(val: RoleValue<T>) -> Self {
match val {
RoleValue::Role(role) => role.into(),
RoleValue::Raw(value) => value,
}
}
}
impl<T> PartialEq<Self> for RoleValue<T>
where
T: RoleVariant,
{
fn eq(&self, other: &Self) -> bool {
Into::<usize>::into(*self) == Into::<usize>::into(*other)
}
}
impl<T> Eq for RoleValue<T> where T: RoleVariant {}