use std::sync::Arc;
use anyhow::Context as _;
use clap::Parser;
use tracing::instrument;
#[derive(Parser, Debug)]
pub enum Command {
Run(RunArgs),
Serve(ServeArgs),
}
#[derive(Parser, Debug)]
pub struct RunArgs {
#[arg(short, long, default_value = wrpc_cli::nats::DEFAULT_URL)]
nats: String,
#[arg(long, default_value = crate::DEFAULT_TIMEOUT)]
timeout: humantime::Duration,
#[arg(long, default_value = "")]
import: String,
workload: String,
}
#[derive(Parser, Debug)]
pub struct ServeArgs {
#[arg(short, long, default_value = wrpc_cli::nats::DEFAULT_URL)]
nats: String,
#[arg(long, default_value = crate::DEFAULT_TIMEOUT)]
timeout: humantime::Duration,
#[arg(short, long)]
group: Option<String>,
#[arg(long, default_value = "")]
import: String,
#[arg(long, default_value = "")]
export: String,
workload: String,
}
#[instrument(level = "trace", ret(level = "trace"))]
pub async fn handle_run(
RunArgs {
nats,
timeout,
import,
ref workload,
}: RunArgs,
) -> anyhow::Result<()> {
let nats = wrpc_cli::nats::connect(nats)
.await
.context("failed to connect to NATS.io")?;
let nats = wrpc_transport_nats::Client::new(nats, import, None)
.await
.context("failed to construct NATS.io transport client")?;
crate::handle_run(nats, None, *timeout, workload).await
}
#[instrument(level = "trace", ret(level = "trace"))]
pub async fn handle_serve(
ServeArgs {
nats,
timeout,
export,
import,
group,
ref workload,
}: ServeArgs,
) -> anyhow::Result<()> {
let nats = wrpc_cli::nats::connect(nats)
.await
.context("failed to connect to NATS")?;
let nats = Arc::new(nats);
let exports = wrpc_transport_nats::Client::new(Arc::clone(&nats), export, group.map(Arc::from))
.await
.context("failed to construct NATS.io transport export client")?;
let imports = wrpc_transport_nats::Client::new(nats, import, None)
.await
.context("failed to construct NATS.io transport import client")?;
crate::handle_serve(exports, imports, None, *timeout, workload).await
}
#[instrument(level = "trace", ret(level = "trace"))]
pub async fn run(cmd: Command) -> anyhow::Result<()> {
match cmd {
Command::Run(args) => handle_run(args).await,
Command::Serve(args) => handle_serve(args).await,
}
}