use anyhow::Result;
use clap::Parser;
use tokio_util::sync::CancellationToken;
use zelos_trace_grpc::subscribe::TraceSubscribeClient;
use zelos_trace_types::ipc::IpcMessageWithId;
#[derive(Debug, Parser)]
struct Args {
#[arg(short = 'H', long, default_value = "localhost:2300")]
host: String,
#[arg(short, long)]
filter: Option<String>,
}
#[tokio::main]
async fn main() -> Result<()> {
let args = Args::parse();
let (sender, receiver) = flume::bounded::<IpcMessageWithId>(100);
let shutdown = CancellationToken::new();
{
let shutdown = shutdown.clone();
tokio::spawn(async move {
tokio::signal::ctrl_c().await?;
shutdown.cancel();
Ok::<(), anyhow::Error>(())
})
};
let addr = format!("grpc://{}", args.host);
eprintln!("[*] Connecting to gRPC server at {}", addr);
let (client, task_client) = TraceSubscribeClient::new(sender, shutdown.clone(), addr).await?;
let client_task = tokio::spawn(task_client);
if let Some(ref f) = args.filter {
eprintln!("[*] Using filter: {}", f);
}
client.subscribe(args.filter, None).await?;
while let Ok(ipc) = receiver.recv() {
println!("{:?}", ipc);
}
eprintln!("[*] Response stream ended");
shutdown.cancel();
client_task.await??;
Ok(())
}