klickhouse 0.15.2

Klickhouse is a pure Rust SDK for working with Clickhouse with the native protocol in async environments with minimal boilerplate and maximal performance.
Documentation
use indexmap::IndexMap;
use klickhouse::block::Block;
use klickhouse::{Type, Value};
use tokio_stream::StreamExt;

#[tokio::test]
async fn test_client() {
    let _ = env_logger::builder()
        .filter_level(log::LevelFilter::Info)
        .try_init();
    let client = super::get_client().await;

    super::prepare_table(
        "test_enum",
        " e8 Enum8('ONE' = 1, 'TWO' = 2), e16 Enum16('THREE' = 3, 'FOUR' = 4)",
        &client,
    )
    .await;

    let column_types = IndexMap::from([
        (
            "e8".to_string(),
            Type::Enum8(vec![("ONE".to_string(), 1), ("TWO".to_string(), 2)]),
        ),
        (
            "e16".to_string(),
            Type::Enum16(vec![("THREE".to_string(), 3), ("FOUR".to_string(), 4)]),
        ),
    ]);

    let column_data = IndexMap::from([
        ("e8".to_string(), vec![Value::Enum8(1), Value::Enum8(2)]),
        ("e16".to_string(), vec![Value::Enum16(3), Value::Enum16(4)]),
    ]);
    let inserted_block = Block {
        info: Default::default(),
        rows: 2,
        column_types,
        column_data,
    };

    let mut insert_res = client
        .insert_native_raw(
            "INSERT INTO test_enum FORMAT Native",
            futures_util::stream::iter([inserted_block.clone()]),
        )
        .await
        .unwrap();

    let first_block = insert_res.next().await.unwrap().unwrap();
    assert_eq!(first_block.column_types, inserted_block.column_types);

    while let Some(block) = insert_res.next().await {
        println!("insert: {:?}", block);
        block.unwrap();
    }

    let mut result = client.query_raw("SELECT * FROM test_enum").await.unwrap();

    let first_block = result.next().await.unwrap().unwrap();
    let second_block = result.next().await.unwrap().unwrap();
    let third_block = result.next().await.unwrap().unwrap();

    println!("first_block: {:?}", first_block);
    assert_eq!(first_block.column_types, inserted_block.column_types);
    assert_eq!(first_block.column_types, second_block.column_types);

    println!("second_block: {:?}", second_block);
    assert_eq!(second_block.rows, 2);
    assert_eq!(second_block.column_data, inserted_block.column_data);

    println!("third_block: {:?}", third_block);
    assert_eq!(third_block.rows, 0);
    assert!(third_block.column_types.is_empty());

    assert!(result.next().await.is_none());
}