pub trait RamaFrom<T, CrateMarker = ()> {
fn rama_from(value: T) -> Self;
}
impl<T, U> RamaFrom<T> for U
where
U: From<T>,
{
fn rama_from(value: T) -> Self {
Self::from(value)
}
}
pub trait RamaInto<T, CrateMarker = ()>: Sized {
fn rama_into(self) -> T;
}
impl<T, U, CrateMarker> RamaInto<U, CrateMarker> for T
where
U: RamaFrom<T, CrateMarker>,
{
#[inline(always)]
fn rama_into(self) -> U {
U::rama_from(self)
}
}
pub trait RamaTryFrom<T, CrateMarker = ()>: Sized {
type Error;
fn rama_try_from(value: T) -> Result<Self, Self::Error>;
}
impl<T, U> RamaTryFrom<T> for U
where
U: TryFrom<T>,
{
type Error = U::Error;
fn rama_try_from(value: T) -> Result<Self, Self::Error> {
Self::try_from(value)
}
}
pub trait RamaTryInto<T, CrateMarker = ()>: Sized {
type Error;
fn rama_try_into(self) -> Result<T, Self::Error>;
}
impl<T, U, CrateMarker> RamaTryInto<U, CrateMarker> for T
where
U: RamaTryFrom<T, CrateMarker>,
{
type Error = U::Error;
#[inline(always)]
fn rama_try_into(self) -> Result<U, U::Error> {
U::rama_try_from(self)
}
}
pub trait FromRef<T> {
fn from_ref(input: &T) -> Self;
}
pub use rama_macros::FromRef;
impl<T> FromRef<T> for T
where
T: Clone,
{
fn from_ref(input: &T) -> Self {
input.clone()
}
}