kali 0.1.0

A query builder and orm-ish crate built on sqlx
Documentation
use crate::builder::{expr::Expr, ordering::ColumnOrdering, value::Value};

pub trait Column: Copy + Send + Sync {
    fn to_col_name(&self) -> &str;

    fn write(&self, f: &mut String) {
        f.push('"');
        f.push_str(self.to_col_name());
        f.push('"');
    }
}

pub trait ColumnExpr<'a, C: Column> {
    fn eq<V: Into<Value>>(self, value: V) -> Expr<'a, C>;
    fn gt<V: Into<Value>>(self, value: V) -> Expr<'a, C>;
    fn lt<V: Into<Value>>(self, value: V) -> Expr<'a, C>;
    fn like<V: Into<Value>>(self, value: V) -> Expr<'a, C>;
    fn in_list<V: Into<Value>>(self, values: Vec<V>) -> Expr<'a, C>;
    fn is_null(self) -> Expr<'a, C>;

    fn asc(self) -> ColumnOrdering<C>;
    fn desc(self) -> ColumnOrdering<C>;
    fn asc_nulls_first(self) -> ColumnOrdering<C>;
    fn asc_nulls_last(self) -> ColumnOrdering<C>;
    fn desc_nulls_first(self) -> ColumnOrdering<C>;
    fn desc_nulls_last(self) -> ColumnOrdering<C>;
}

impl<'a, C: Column> ColumnExpr<'a, C> for C {
    fn eq<V: Into<Value>>(self, value: V) -> Expr<'a, C> {
        Expr::Equal(self, value.into())
    }

    fn gt<V: Into<Value>>(self, value: V) -> Expr<'a, C> {
        Expr::Gt(self, value.into())
    }

    fn lt<V: Into<Value>>(self, value: V) -> Expr<'a, C> {
        Expr::Lt(self, value.into())
    }

    fn like<V: Into<Value>>(self, value: V) -> Expr<'a, C> {
        Expr::Like(self, value.into())
    }

    fn in_list<V: Into<Value>>(self, values: Vec<V>) -> Expr<'a, C> {
        let values = values.into_iter().map(|v| v.into()).collect();
        Expr::In(self, values)
    }

    fn is_null(self) -> Expr<'a, C> {
        Expr::Equal(self, Value::Null)
    }

    fn asc(self) -> ColumnOrdering<C> {
        ColumnOrdering::Asc(self)
    }

    fn desc(self) -> ColumnOrdering<C> {
        ColumnOrdering::Desc(self)
    }

    fn asc_nulls_first(self) -> ColumnOrdering<C> {
        ColumnOrdering::AscNullsFirst(self)
    }

    fn asc_nulls_last(self) -> ColumnOrdering<C> {
        ColumnOrdering::AscNullsLast(self)
    }

    fn desc_nulls_first(self) -> ColumnOrdering<C> {
        ColumnOrdering::DescNullsFirst(self)
    }

    fn desc_nulls_last(self) -> ColumnOrdering<C> {
        ColumnOrdering::DescNullsLast(self)
    }
}