easy-sql 0.101.1

Macro-first SQL toolkit with compile-time checked queries, optional migrations on top of sqlx.
Documentation
use super::*;
use anyhow::Context;
use easy_macros::always_context;
use easy_sql_macros::{query, query_lazy};
use futures::StreamExt;

type SqlxPool = sqlx::Pool<<TestDriver as crate::Driver>::InternalDriver>;

#[always_context(skip(!))]
async fn pool_query_insert_and_read(mut conn: &SqlxPool) -> anyhow::Result<ExprTestData> {
    let data = expr_test_data(77, "pool-fn", true, Some("from-pool-fn"));
    query!(conn, INSERT INTO ExprTestTable VALUES {data}).await?;

    let row: ExprTestData = query!(conn,
        SELECT ExprTestData FROM ExprTestTable WHERE ExprTestTable.id = 1
    )
    .await?;

    Ok(row)
}

#[always_context(skip(!))]
async fn pool_query_lazy_collect(conn: &SqlxPool) -> anyhow::Result<Vec<ExprTestData>> {
    let mut lazy = query_lazy!(
        SELECT ExprTestData FROM ExprTestTable WHERE int_field >= 20 ORDER BY ExprTestTable.id
    )?;

    let mut rows = Vec::new();
    let mut stream = lazy.fetch(conn);
    while let Some(row) = stream.next().await {
        rows.push(row.context("Failed to fetch row from pool lazy stream")?);
    }

    Ok(rows)
}

#[always_context(skip(!))]
#[tokio::test]
async fn test_query_with_pool_function_argument() -> anyhow::Result<()> {
    let pool_resource = setup_sqlx_pool_for_testing::<ExprTestTable>().await?;
    let pool = pool_resource.pool();

    let row = pool_query_insert_and_read(pool).await?;

    assert_eq!(row.int_field, 77);
    assert_eq!(row.str_field, "pool-fn");
    assert_eq!(row.nullable_field, Some("from-pool-fn".to_string()));

    Ok(())
}

#[always_context(skip(!))]
#[tokio::test]
async fn test_query_lazy_with_pool_function_argument() -> anyhow::Result<()> {
    let pool_resource = setup_sqlx_pool_for_testing::<ExprTestTable>().await?;
    let mut pool = pool_resource.pool();

    let seed = vec![
        expr_test_data(10, "a", true, None),
        expr_test_data(20, "b", false, None),
        expr_test_data(30, "c", true, None),
    ];
    query!(pool, INSERT INTO ExprTestTable VALUES {seed}).await?;

    let rows = pool_query_lazy_collect(pool).await?;

    assert_eq!(rows.len(), 2);
    assert_eq!(rows[0].int_field, 20);
    assert_eq!(rows[1].int_field, 30);

    Ok(())
}