kafrust 0.2.28

A pure Rust Kafka client with no librdkafka or C client binding dependency.
Documentation
mod common;

use kafrust::{AdminClient, ClientConfig, Error};

#[tokio::main]
async fn main() -> kafrust::Result<()> {
    let bootstrap_servers = common::bootstrap_servers_from_env();
    let group_id = std::env::var("KAFRUST_GROUP_ID").unwrap_or_else(|_| "kafrust-smoke".to_owned());
    let config = common::apply_security(
        ClientConfig::new(bootstrap_servers).client_id("kafrust-admin-group-example"),
    )?;
    let admin = AdminClient::new(config);
    let groups = admin.list_groups().await?;
    let listing = groups
        .iter()
        .find(|listing| listing.group_id() == group_id)
        .ok_or_else(|| Error::MissingGroupDescription {
            group_id: group_id.clone(),
        })?;
    println!(
        "listed group {} protocol={} coordinator={} throttle={:?}",
        listing.group_id(),
        listing.protocol_type(),
        listing.coordinator_id(),
        listing.throttle_time()
    );

    let descriptions = admin
        .describe_consumer_groups(std::slice::from_ref(&group_id))
        .await?;
    let description = descriptions
        .iter()
        .find(|description| description.group_id() == group_id)
        .ok_or_else(|| Error::MissingGroupDescription {
            group_id: group_id.clone(),
        })?;
    if !description.is_success() {
        return Err(Error::Broker {
            code: description.error_code(),
            context: format!("describe consumer group {group_id}"),
        });
    }

    println!(
        "group {} state={} protocol={}/{} members={} throttle={:?}",
        description.group_id(),
        description.state(),
        description.protocol_type(),
        description.protocol_name(),
        description.members().len(),
        description.throttle_time()
    );
    Ok(())
}