rjango 0.1.1

A full-stack Rust backend framework inspired by Django
Documentation
use sea_orm::sea_query::{Expr, SimpleExpr};

use super::custom_function;

/// SQL CURRENT_TIMESTAMP.
pub fn now() -> SimpleExpr {
    Expr::cust("CURRENT_TIMESTAMP")
}

/// SQL EXTRACT(part FROM expr).
pub fn extract(part: &str, expr: SimpleExpr) -> SimpleExpr {
    Expr::cust_with_exprs(format!("EXTRACT({part} FROM ?)"), [expr])
}

/// SQL DATE_TRUNC(part, expr).
pub fn trunc(part: &str, expr: SimpleExpr) -> SimpleExpr {
    custom_function("DATE_TRUNC", vec![Expr::value(part), expr])
}

#[cfg(test)]
mod tests {
    use super::{extract, now, trunc};
    use sea_orm::sea_query::{Alias, Expr, PostgresQueryBuilder, Query, SimpleExpr};

    fn column(name: &str) -> SimpleExpr {
        Expr::col(Alias::new(name)).into()
    }

    fn render_select_expr(expr: SimpleExpr, alias: &str) -> String {
        Query::select()
            .expr_as(expr, Alias::new(alias))
            .from(Alias::new("widgets"))
            .to_owned()
            .to_string(PostgresQueryBuilder)
    }

    #[test]
    fn test_now() {
        let sql = render_select_expr(now(), "current_time");
        assert!(
            sql.contains("CURRENT_TIMESTAMP"),
            "expected CURRENT_TIMESTAMP SQL, got: {sql}"
        );
    }

    #[test]
    fn test_extract() {
        let sql = render_select_expr(extract("YEAR", column("created_at")), "created_year");
        assert!(
            sql.contains("EXTRACT(YEAR FROM"),
            "expected EXTRACT SQL, got: {sql}"
        );
    }

    #[test]
    fn test_trunc() {
        let sql = render_select_expr(trunc("day", column("created_at")), "created_day");
        assert!(
            sql.contains("DATE_TRUNC"),
            "expected DATE_TRUNC SQL, got: {sql}"
        );
        assert!(
            sql.contains("'day'"),
            "expected trunc precision literal, got: {sql}"
        );
    }
}