dink-sdk 0.3.1

Rust SDK for Dink edge mesh platform — JSON-over-NATS RPC for IoT and edge computing
Documentation
use std::sync::Arc;

use crate::edge::EdgeClient;
use crate::error::Result;
use crate::traits::ServiceHandler;
use crate::types::EdgeConfig;

/// Convenience entry point: loads config from env vars, connects, exposes
/// services, and blocks until SIGINT/SIGTERM.
pub async fn edge_worker(services: Vec<Arc<dyn ServiceHandler>>) -> Result<()> {
    let api_key = std::env::var("DINK_EDGE_KEY")
        .or_else(|_| std::env::var("DINK_API_KEY"))
        .map_err(|_| {
            crate::error::DinkError::Config("DINK_EDGE_KEY or DINK_API_KEY must be set".into())
        })?;

    let server_url = std::env::var("DINK_SERVER_URL").ok();
    let edge_name = std::env::var("EDGE_NAME").ok();

    let config = EdgeConfig {
        api_key,
        server_url,
        edge_name,
        ..Default::default()
    };

    let client = EdgeClient::connect(config).await?;

    for svc in services {
        client.expose_service(svc).await?;
    }

    // Block until OS signal
    let mut sigint = tokio::signal::unix::signal(tokio::signal::unix::SignalKind::interrupt())
        .map_err(|e| crate::error::DinkError::Connection(e.to_string()))?;
    let mut sigterm = tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate())
        .map_err(|e| crate::error::DinkError::Connection(e.to_string()))?;

    tokio::select! {
        _ = sigint.recv() => {
            tracing::info!("received SIGINT, shutting down");
        }
        _ = sigterm.recv() => {
            tracing::info!("received SIGTERM, shutting down");
        }
    }

    client.disconnect().await?;
    Ok(())
}