81 lines
1.6 KiB
Rust
81 lines
1.6 KiB
Rust
// build-pass
|
|
//
|
|
// Tests that overflows do not occur in certain situations
|
|
// related to generic diesel code
|
|
|
|
use mini_diesel::*;
|
|
|
|
pub trait HandleDelete<K> {}
|
|
|
|
pub fn handle_delete<D, R>()
|
|
where
|
|
R: HasTable,
|
|
R::Table: HandleDelete<D> + 'static,
|
|
{
|
|
}
|
|
|
|
impl<K, T> HandleDelete<K> for T
|
|
where
|
|
T: Table + HasTable<Table = T> + 'static,
|
|
K: 'static,
|
|
&'static K: Identifiable<Table = T>,
|
|
T::PrimaryKey: EqAll<<&'static K as Identifiable>::Id>,
|
|
T::Query: FilterDsl<<T::PrimaryKey as EqAll<<&'static K as Identifiable>::Id>>::Output>,
|
|
Filter<T::Query, <T::PrimaryKey as EqAll<<&'static K as Identifiable>::Id>>::Output>:
|
|
IntoUpdateTarget<Table = T>,
|
|
{
|
|
}
|
|
|
|
mod mini_diesel {
|
|
pub trait HasTable {
|
|
type Table: Table;
|
|
}
|
|
|
|
pub trait Identifiable: HasTable {
|
|
type Id;
|
|
}
|
|
|
|
pub trait EqAll<Rhs> {
|
|
type Output;
|
|
}
|
|
|
|
pub trait IntoUpdateTarget: HasTable {
|
|
type WhereClause;
|
|
}
|
|
|
|
pub trait Query {
|
|
type SqlType;
|
|
}
|
|
|
|
pub trait AsQuery {
|
|
type Query: Query;
|
|
}
|
|
impl<T: Query> AsQuery for T {
|
|
type Query = Self;
|
|
}
|
|
|
|
pub trait FilterDsl<Predicate> {
|
|
type Output;
|
|
}
|
|
|
|
impl<T, Predicate> FilterDsl<Predicate> for T
|
|
where
|
|
T: Table,
|
|
T::Query: FilterDsl<Predicate>,
|
|
{
|
|
type Output = Filter<T::Query, Predicate>;
|
|
}
|
|
|
|
pub trait QuerySource {
|
|
type FromClause;
|
|
}
|
|
|
|
pub trait Table: QuerySource + AsQuery + Sized {
|
|
type PrimaryKey;
|
|
}
|
|
|
|
pub type Filter<Source, Predicate> = <Source as FilterDsl<Predicate>>::Output;
|
|
}
|
|
|
|
fn main() {}
|