use std::time::Duration;
use clap::Parser;
use tracing::info;
use tracing_subscriber::{EnvFilter, fmt};
use wireband_edge::client::{ClientConfig, WireBandClient};
#[derive(Parser, Debug)]
#[command(
name = "wireband-edge",
version,
about = "Wire.Band edge gateway — bridge MQTT to a Wire.Band backend"
)]
struct Args {
#[arg(short, long, default_value = "mqtt://localhost:1883")]
broker: String,
#[arg(short, long, num_args = 1.., default_value = "#")]
topics: Vec<String>,
#[arg(long, default_value = "http://localhost:8000")]
backend: String,
#[arg(short, long, default_value = "edge-node")]
device_id: String,
#[arg(long)]
api_key: Option<String>,
#[arg(long, default_value_t = 0.0)]
delta_threshold: f64,
#[arg(long, default_value_t = 1.0)]
flush_interval: f64,
#[arg(long, default_value_t = 200)]
flush_batch: usize,
#[arg(long, default_value_t = 50_000)]
buffer_size: usize,
#[arg(long, default_value_t = 3)]
max_retries: u32,
#[arg(long, default_value = "info")]
log_level: String,
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let args = Args::parse();
let filter = EnvFilter::try_from_env("WIREBAND_LOG")
.unwrap_or_else(|_| EnvFilter::new(&args.log_level));
fmt().with_env_filter(filter).init();
let config = ClientConfig {
backend_url: args.backend.clone(),
device_id: args.device_id.clone(),
api_key: args.api_key.clone(),
buffer_size: args.buffer_size,
flush_interval: Duration::from_secs_f64(args.flush_interval),
flush_batch: args.flush_batch,
max_retries: args.max_retries,
delta_threshold: args.delta_threshold,
..Default::default()
};
let client = WireBandClient::new(config);
client.start();
info!(
device_id = %args.device_id,
broker = %args.broker,
topics = ?args.topics,
backend = %args.backend,
delta = args.delta_threshold,
"Wire.Band edge starting"
);
#[cfg(feature = "mqtt")]
{
use wireband_edge::mqtt::MqttConnector;
let result = MqttConnector::new(&args.broker, args.delta_threshold)
.run(client.clone(), args.topics)
.await;
client.stop().await;
if let Err(e) = result {
eprintln!("MQTT error: {e}");
std::process::exit(1);
}
}
#[cfg(not(feature = "mqtt"))]
{
eprintln!(
"No connector enabled. Rebuild with a connector feature, e.g.:\n\
cargo build --features mqtt"
);
client.stop().await;
std::process::exit(1);
}
Ok(())
}