Skip to main content

hyphae/traits/
foreign_key.rs

1/// Marker trait for ID types associated with a parent/entity type `T`.
2pub trait IdFor<T> {
3    type MapKey;
4
5    fn map_key(&self) -> Self::MapKey;
6}
7
8impl<T, I> IdFor<T> for Option<I>
9where
10    I: IdFor<T>,
11{
12    type MapKey = Option<I::MapKey>;
13
14    fn map_key(&self) -> Self::MapKey {
15        self.as_ref().map(IdFor::map_key)
16    }
17}
18
19/// Inverse mapping from an ID type to its parent/entity type.
20pub trait IdType {
21    type Parent;
22}
23
24impl<I> IdType for Option<I>
25where
26    I: IdType,
27{
28    type Parent = I::Parent;
29}
30
31/// Foreign-key trait for FK joins.
32///
33/// Implement this on a row/value type to expose its foreign key value for parent `T`.
34pub trait HasForeignKey<T> {
35    type ForeignKey: IdFor<T> + IdType<Parent = T>;
36
37    fn fk(&self) -> Self::ForeignKey;
38}
39
40/// Convert a right-side join key into the left-side join key representation.
41pub trait JoinKeyFrom<R> {
42    fn join_key_from(value: &R) -> Self;
43}
44
45impl<T: Clone> JoinKeyFrom<T> for T {
46    fn join_key_from(value: &T) -> Self {
47        value.clone()
48    }
49}
50
51impl<T: Clone> JoinKeyFrom<T> for Option<T> {
52    fn join_key_from(value: &T) -> Self {
53        Some(value.clone())
54    }
55}