pub trait IdFor<T> {
type MapKey;
fn map_key(&self) -> Self::MapKey;
}
impl<T, I> IdFor<T> for Option<I>
where
I: IdFor<T>,
{
type MapKey = Option<I::MapKey>;
fn map_key(&self) -> Self::MapKey {
self.as_ref().map(IdFor::map_key)
}
}
pub trait IdType {
type Parent;
}
impl<I> IdType for Option<I>
where
I: IdType,
{
type Parent = I::Parent;
}
pub trait HasForeignKey<T> {
type ForeignKey: IdFor<T> + IdType<Parent = T>;
fn fk(&self) -> Self::ForeignKey;
}
pub trait JoinKeyFrom<R> {
fn join_key_from(value: &R) -> Self;
}
impl<T: Clone> JoinKeyFrom<T> for T {
fn join_key_from(value: &T) -> Self {
value.clone()
}
}
impl<T: Clone> JoinKeyFrom<T> for Option<T> {
fn join_key_from(value: &T) -> Self {
Some(value.clone())
}
}