use diesel::expression::{AsExpression, Expression};
use diesel::pg::expression::operators::IsContainedBy;
use super::operators::SameAs;
use sql_types::{self, Circle, Point};
pub trait PgSameAsExpressionMethods<ST>: Expression + Sized {
fn same_as<T>(self: Self, other: T) -> SameAs<Self, T::Expression>
where
T: AsExpression<ST>,
{
SameAs::new(self, other.as_expression())
}
}
impl<T: Expression<SqlType = Point>> PgSameAsExpressionMethods<Point> for T {}
impl<T: Expression<SqlType = sql_types::Box>> PgSameAsExpressionMethods<sql_types::Box> for T {}
impl<T: Expression<SqlType = Circle>> PgSameAsExpressionMethods<Circle> for T {}
pub trait PgIsContainedByExpressionMethods<ST>: Expression + Sized {
fn is_contained_by<T>(self: Self, other: T) -> IsContainedBy<Self, T::Expression>
where
T: AsExpression<ST>,
{
IsContainedBy::new(self, other.as_expression())
}
}
pub trait CanBeContainedByCircle {}
impl CanBeContainedByCircle for Point {}
impl CanBeContainedByCircle for Circle {}
pub trait CanBeContainedByBox {}
impl CanBeContainedByBox for Point {}
impl CanBeContainedByBox for Circle {}
impl CanBeContainedByBox for sql_types::Box {}
impl<T> PgIsContainedByExpressionMethods<Circle> for T
where
T: Expression,
T::SqlType: CanBeContainedByCircle,
{}
impl<T> PgIsContainedByExpressionMethods<sql_types::Box> for T
where
T: Expression,
T::SqlType: CanBeContainedByBox,
{}