oxia-client 0.1.0

Native Rust client SDK for Oxia, a distributed key-value store. Provides an idiomatic, asynchronous API built on Tokio.
Documentation
use oxia::OxiaClient;
use std::time::Duration;
use tracing::info;
use tracing::level_filters::LevelFilter;

#[tokio::main]
async fn main() {
    tracing_subscriber::fmt()
        .with_env_filter(
            tracing_subscriber::EnvFilter::builder()
                .with_default_directive(LevelFilter::INFO.into())
                .from_env_lossy(),
        )
        .with_target(false)
        .init();

    let client = OxiaClient::connect("localhost:6648").await.unwrap();

    let partition_key = "my-partition";
    let base_key = "seq/events";

    // Subscribe to sequence updates for the key.
    let mut updates = client
        .sequence_updates(base_key, partition_key)
        .buffer_size(50)
        .await
        .unwrap();
    info!("Subscribed to sequence updates for key '{}'", base_key);

    // Spawn a task to listen for sequence updates
    let listener = tokio::spawn(async move {
        let mut count = 0;
        while let Some(highest_key) = updates.recv().await {
            info!("Sequence update: highest_sequence_key={:?}", highest_key);
            count += 1;
            if count >= 5 {
                break;
            }
        }
        info!("Received {} sequence updates", count);
    });

    // Give the listener time to connect
    tokio::time::sleep(Duration::from_millis(500)).await;

    // Put records with sequence key deltas - the server assigns sequential
    // suffixes and returns the generated key.
    for i in 1..=5 {
        let result = client
            .put(base_key, format!("event-{i}"))
            .partition_key(partition_key)
            .sequence_key_deltas([1])
            .await
            .unwrap();
        info!("Put sequence event {}: generated key={:?}", i, result.key);
    }

    // Wait for listener to process updates (with timeout)
    let _ = tokio::time::timeout(Duration::from_secs(5), listener).await;

    // Cleanup
    client
        .delete_range("seq/", "seq/~")
        .partition_key(partition_key)
        .await
        .unwrap();
    info!("Cleaned up sequence keys.");

    client.close().await.unwrap();
}