tokio-postgres-extractor 0.7.0

High-performance extractors for tokio_postgres
Documentation
use {
    crate::{stream::RowStreamExtractExt, tests::connect},
    futures_util::TryStreamExt,
    std::pin::pin,
    tokio_postgres_extractor_macros::{Columns, Extract},
};

#[tokio::test]
async fn test() {
    #[derive(Columns, Extract)]
    struct X {
        x: i32,
        y: i32,
    }

    let res: Vec<X> = connect()
        .await
        .query_raw("select * from (values (1, 2), (3, 4)) t(x, y)", None::<i32>)
        .await
        .unwrap()
        .extract()
        .try_collect()
        .await
        .unwrap();

    assert_eq!(res.len(), 2);
    assert_eq!(res[0].x, 1);
    assert_eq!(res[0].y, 2);
    assert_eq!(res[1].x, 3);
    assert_eq!(res[1].y, 4);
}

#[tokio::test]
async fn test_mut() {
    #[derive(Columns, Extract)]
    struct X {
        x: i32,
        y: i32,
    }

    let stream = connect()
        .await
        .query_raw("select * from (values (1, 2), (3, 4)) t(x, y)", None::<i32>)
        .await
        .unwrap();
    let mut stream = pin!(stream);

    let res: Vec<X> = stream.as_mut().extract_mut().try_collect().await.unwrap();

    assert_eq!(res.len(), 2);
    assert_eq!(res[0].x, 1);
    assert_eq!(res[0].y, 2);
    assert_eq!(res[1].x, 3);
    assert_eq!(res[1].y, 4);
    assert_eq!(stream.rows_affected(), Some(2));
}