use crate::{
enums::{IsVariant, VariantProxy},
path::TStr,
};
pub trait EnumExt {
#[inline(always)]
fn as_variant<V>(&self, vari: TStr<V>) -> Result<&VariantProxy<Self, TStr<V>>, &Self>
where
Self: IsVariant<TStr<V>>,
{
if IsVariant::is_variant_(self, vari) {
unsafe { Ok(VariantProxy::from_ref(self, vari)) }
} else {
Err(self)
}
}
#[inline(always)]
fn as_mut_variant<V>(
&mut self,
vari: TStr<V>,
) -> Result<&mut VariantProxy<Self, TStr<V>>, &mut Self>
where
Self: IsVariant<TStr<V>>,
{
if IsVariant::is_variant_(&*self, vari) {
unsafe { Ok(VariantProxy::from_mut(self, vari)) }
} else {
Err(self)
}
}
#[inline(always)]
unsafe fn as_raw_mut_variant<V>(
this: *mut Self,
vari: TStr<V>,
) -> Result<*mut VariantProxy<Self, TStr<V>>, *mut Self>
where
Self: IsVariant<TStr<V>>,
{
if IsVariant::is_variant_(&*this, vari) {
Ok(VariantProxy::from_raw_mut(this, vari))
} else {
Err(this)
}
}
#[inline(always)]
fn into_variant<V>(self, vari: TStr<V>) -> Result<VariantProxy<Self, TStr<V>>, Self>
where
Self: IsVariant<TStr<V>> + Sized,
{
if IsVariant::is_variant_(&self, vari) {
unsafe { Ok(VariantProxy::new(self, vari)) }
} else {
Err(self)
}
}
}
impl<This: ?Sized> EnumExt for This {}