batata-client 0.0.2

Rust client for Batata/Nacos service discovery and configuration management
Documentation
//! Configuration service example
//!
//! This example demonstrates how to use the ConfigService for:
//! - Getting configuration
//! - Publishing configuration
//! - Listening for configuration changes

use batata_client::prelude::*;

#[tokio::main]
async fn main() -> Result<()> {
    // Initialize logging
    tracing_subscriber::fmt::init();

    // Create client
    let client = BatataClient::builder()
        .server_addr("localhost:8848")
        .namespace("public")
        .app_name("config-example")
        .build()
        .await?;

    println!("Connected to Batata server!");

    let config_service = client.config_service();

    // Publish a configuration
    println!("\n--- Publishing configuration ---");
    let success = config_service
        .publish_config("example-config", "DEFAULT_GROUP", "key=value\nfoo=bar")
        .await?;
    println!("Publish result: {}", success);

    // Get configuration
    println!("\n--- Getting configuration ---");
    match config_service.get_config("example-config", "DEFAULT_GROUP").await {
        Ok(content) => println!("Config content:\n{}", content),
        Err(e) => println!("Failed to get config: {}", e),
    }

    // Add listener for configuration changes
    println!("\n--- Adding configuration listener ---");
    config_service.add_callback_listener("example-config", "DEFAULT_GROUP", |event| {
        println!("Configuration changed!");
        println!("  Data ID: {}", event.data_id);
        println!("  Group: {}", event.group);
        println!("  Change type: {:?}", event.change_type);
        println!("  New content: {}", event.new_content);
    });

    // Start config service to enable listening
    client.start_config_service().await?;

    // Update configuration to trigger listener
    println!("\n--- Updating configuration ---");
    config_service
        .publish_config(
            "example-config",
            "DEFAULT_GROUP",
            "key=new_value\nfoo=updated",
        )
        .await?;

    // Wait a bit for the listener to be triggered
    tokio::time::sleep(tokio::time::Duration::from_secs(35)).await;

    // Remove configuration
    println!("\n--- Removing configuration ---");
    let removed = config_service
        .remove_config("example-config", "DEFAULT_GROUP")
        .await?;
    println!("Remove result: {}", removed);

    // Shutdown
    client.shutdown().await;
    println!("\nClient shutdown complete.");

    Ok(())
}