use interstice_abi::ReducerTableRef;
pub trait CanRead<Row> {}
pub trait CanInsert<Row> {}
pub trait CanUpdate<Row> {}
pub trait CanDelete<Row> {}
pub trait ReducerCapPiece {
fn extend_reducer_schema(
reads: &mut Vec<ReducerTableRef>,
inserts: &mut Vec<ReducerTableRef>,
updates: &mut Vec<ReducerTableRef>,
deletes: &mut Vec<ReducerTableRef>,
);
}
pub trait ReducerCaps {
fn extend_reducer_schema(
reads: &mut Vec<ReducerTableRef>,
inserts: &mut Vec<ReducerTableRef>,
updates: &mut Vec<ReducerTableRef>,
deletes: &mut Vec<ReducerTableRef>,
);
}
impl ReducerCaps for () {
fn extend_reducer_schema(
_reads: &mut Vec<ReducerTableRef>,
_inserts: &mut Vec<ReducerTableRef>,
_updates: &mut Vec<ReducerTableRef>,
_deletes: &mut Vec<ReducerTableRef>,
) {
}
}
impl<T: ReducerCapPiece> ReducerCaps for T {
fn extend_reducer_schema(
reads: &mut Vec<ReducerTableRef>,
inserts: &mut Vec<ReducerTableRef>,
updates: &mut Vec<ReducerTableRef>,
deletes: &mut Vec<ReducerTableRef>,
) {
T::extend_reducer_schema(reads, inserts, updates, deletes);
}
}
impl<A: ReducerCaps, B: ReducerCaps> ReducerCaps for (A, B) {
fn extend_reducer_schema(
reads: &mut Vec<ReducerTableRef>,
inserts: &mut Vec<ReducerTableRef>,
updates: &mut Vec<ReducerTableRef>,
deletes: &mut Vec<ReducerTableRef>,
) {
A::extend_reducer_schema(reads, inserts, updates, deletes);
B::extend_reducer_schema(reads, inserts, updates, deletes);
}
}
impl<A: ReducerCaps> ReducerCaps for (A,) {
fn extend_reducer_schema(
reads: &mut Vec<ReducerTableRef>,
inserts: &mut Vec<ReducerTableRef>,
updates: &mut Vec<ReducerTableRef>,
deletes: &mut Vec<ReducerTableRef>,
) {
A::extend_reducer_schema(reads, inserts, updates, deletes);
}
}
pub trait QueryCapPiece {
fn extend_query_schema(reads: &mut Vec<ReducerTableRef>);
}
pub trait QueryCaps {
fn extend_query_schema(reads: &mut Vec<ReducerTableRef>);
}
impl QueryCaps for () {
fn extend_query_schema(_reads: &mut Vec<ReducerTableRef>) {}
}
impl<T: QueryCapPiece> QueryCaps for T {
fn extend_query_schema(reads: &mut Vec<ReducerTableRef>) {
T::extend_query_schema(reads);
}
}
impl<A: QueryCaps, B: QueryCaps> QueryCaps for (A, B) {
fn extend_query_schema(reads: &mut Vec<ReducerTableRef>) {
A::extend_query_schema(reads);
B::extend_query_schema(reads);
}
}
impl<A: QueryCaps> QueryCaps for (A,) {
fn extend_query_schema(reads: &mut Vec<ReducerTableRef>) {
A::extend_query_schema(reads);
}
}
macro_rules! impl_disjunctive_can {
($trait:ident) => {
impl<Row, A> $trait<Row> for (A,) where A: $trait<Row> {}
};
}
impl_disjunctive_can!(CanRead);
impl_disjunctive_can!(CanInsert);
impl_disjunctive_can!(CanUpdate);
impl_disjunctive_can!(CanDelete);