halo-sqlbuilder 1.0.0

Composable SQL builder and argument collector
Documentation
#[cfg(test)]
mod tests {
    use crate::modifiers::Builder;
    use crate::{
        CTEBuilder, CTEQueryBuilder, CreateTableBuilder, Flavor, SelectBuilder, UnionBuilder,
        create_table_define, create_table_option, cte_query_table, from_tables, select_cols,
        set_default_flavor_scoped,
    };
    use pretty_assertions::assert_eq;

    #[test]
    fn union_basic() {
        let _g = set_default_flavor_scoped(Flavor::MySQL);
        let mut sb1 = SelectBuilder::new();
        select_cols!(sb1, "id");
        from_tables!(sb1, "t1");
        let mut sb2 = SelectBuilder::new();
        select_cols!(sb2, "id");
        from_tables!(sb2, "t2");

        let mut ub = UnionBuilder::new();
        ub.union([sb1, sb2]).order_by_asc("id").limit(10);
        let (sql, _args) = ub.build();
        assert_eq!(
            sql,
            "(SELECT id FROM t1) UNION (SELECT id FROM t2) ORDER BY id ASC LIMIT ?"
        );
    }

    #[test]
    fn cte_basic() {
        let _g = set_default_flavor_scoped(Flavor::MySQL);
        let mut q = CTEQueryBuilder::new();
        let mut sb = SelectBuilder::new();
        select_cols!(sb, "id");
        from_tables!(sb, "users");
        cte_query_table!(q, "t", "id").as_(sb);

        let mut cte = CTEBuilder::new();
        cte.with([q]);
        let (sql, _args) = cte.build();
        assert_eq!(sql, "WITH t (id) AS (SELECT id FROM users)");
    }

    #[test]
    fn create_table_basic() {
        let _g = set_default_flavor_scoped(Flavor::MySQL);
        let mut ct = CreateTableBuilder::new();
        ct.create_table("users").if_not_exists();
        create_table_define!(ct, "id", "INT");
        create_table_define!(ct, "name", "TEXT");
        create_table_option!(ct, "ENGINE=InnoDB");

        let (sql, _args) = ct.build();
        assert_eq!(
            sql,
            "CREATE TABLE IF NOT EXISTS users (id INT, name TEXT) ENGINE=InnoDB"
        );
    }
}