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 ForeignKeyRelation: Send + Sync + 'static {
type Parent: Send + Sync + 'static;
type Child: super::CellValue;
type ForeignKey: IdFor<Self::Parent> + super::CellValue;
fn foreign_key(child: &Self::Child) -> Option<Self::ForeignKey>;
}
pub trait RightJoinKey<RK, RV, JK>: Send + Sync + 'static {
const OPTIONAL: bool;
fn right_join_key(&self, row_key: &RK, row_value: &RV) -> Option<JK>;
}
pub struct RequiredRightKey<F>(pub F);
impl<RK, RV, JK, F> RightJoinKey<RK, RV, JK> for RequiredRightKey<F>
where
F: Fn(&RK, &RV) -> JK + Send + Sync + 'static,
{
const OPTIONAL: bool = false;
#[inline]
fn right_join_key(&self, row_key: &RK, row_value: &RV) -> Option<JK> {
Some((self.0)(row_key, row_value))
}
}
pub struct OptionalRightKey<F>(pub F);
impl<RK, RV, JK, F> RightJoinKey<RK, RV, JK> for OptionalRightKey<F>
where
F: Fn(&RK, &RV) -> Option<JK> + Send + Sync + 'static,
{
const OPTIONAL: bool = true;
#[inline]
fn right_join_key(&self, row_key: &RK, row_value: &RV) -> Option<JK> {
(self.0)(row_key, row_value)
}
}
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())
}
}