esql 0.1.2

Useful and lightweight database extension library for your Rust project
Documentation
use esql::{from, having, select, wh, wh_in, Args, Query, Type};

#[test]
fn simple_query() {
    let query = select("a")
        + select("b,c")
        + from("foobar")
        + wh("foo = 'bar'")
        + wh(("bar = ?", 1))
        + (wh(("d = ?", 10)) | wh(("e != ?", 20)));

    assert_query(
        query,
        "SELECT a,b,c FROM foobar WHERE foo = 'bar' AND bar = ? AND (d = ? OR e != ?)",
        [1, 10, 20],
    );
}

#[test]
fn query_concatenation() {
    let or_conditions = wh(("c = ?", 3)) | wh("d = 4") | wh(("e = ?", 4));
    let query = select("*") + from("test") + wh(("a = ?", 1)) + wh(("b = ?", 2)) + or_conditions;

    assert_query(
        query,
        "SELECT * FROM test WHERE a = ? AND b = ? AND (c = ? OR d = 4 OR e = ?)",
        [1, 2, 3, 4],
    );
}

#[test]
fn query_where_in() {
    let query = select("id")
        + select("email")
        + select("countries.name AS country")
        + from("users")
        + "JOIN countries ON countries.id = users.country_id"
        + wh_in("users.id", [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]);

    assert_query(
        query,
        "SELECT id,email,countries.name AS country FROM users JOIN countries ON countries.id = users.country_id WHERE users.id IN (?,?,?,?,?,?,?,?,?,?)",
        [10, 20, 30, 40, 50, 60, 70, 80, 90, 100],
    );

    let query = select("*") + from("contacts") + wh_in("contacts.id", [] as [u32; 0]);

    assert_query(query, "SELECT * FROM contacts WHERE 1=0", [] as [u32; 0]);
}

#[test]
fn test_empty_conditions() {
    let query = select("foo FROM bar")
        + (having("")
            & having("")
            & having(("test_a = ?", 1))
            & having("")
            & having(("test_b = ?", 2)));

    assert_query(
        query,
        "SELECT foo FROM bar HAVING test_a = ? AND test_b = ?",
        [1, 2],
    );
}

fn assert_query<'a>(
    query: Query<'a>,
    expected_query: &str,
    expected_args: impl IntoIterator<Item = impl Into<Type<'a>>>,
) {
    assert_eq!(
        query.build().unwrap(),
        (
            expected_query.to_string(),
            Args(expected_args.into_iter().map(Into::into).collect()),
        )
    )
}