mod cmd;
mod http_client;
use anyhow::Result;
use clap::{Parser, Subcommand};
use tracing::debug;
const DEFAULT_NATS: &str = "nats://127.0.0.1:4222";
const DEFAULT_BACKEND: &str = "http://127.0.0.1:8080";
#[derive(Parser, Debug)]
#[command(
name = "kanade",
about = "Admin CLI for the kanade endpoint management system",
version
)]
struct Cli {
#[arg(long, global = true, default_value = DEFAULT_NATS, env = "KANADE_NATS_URL")]
server: String,
#[arg(long, global = true, default_value = DEFAULT_BACKEND, env = "KANADE_BACKEND_URL")]
backend_url: String,
#[command(subcommand)]
command: SubCmd,
}
#[derive(Subcommand, Debug)]
enum SubCmd {
Run(cmd::run::RunArgs),
Ping(cmd::ping::PingArgs),
Jetstream(cmd::jetstream::JetstreamArgs),
Revoke(cmd::revoke::RevokeArgs),
Unrevoke(cmd::revoke::UnrevokeArgs),
Kill(cmd::kill::KillArgs),
Deploy(cmd::deploy::DeployArgs),
Schedule(cmd::schedule::ScheduleArgs),
Agent(cmd::agent::AgentArgs),
Config(cmd::config::ConfigArgs),
Group(cmd::group::GroupArgs),
}
#[tokio::main]
async fn main() -> Result<()> {
tracing_subscriber::fmt()
.with_env_filter(
tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| "info,kanade=debug".into()),
)
.init();
let cli = Cli::parse();
let Cli {
server,
backend_url,
command,
} = cli;
if let SubCmd::Deploy(args) = command {
return cmd::deploy::execute(&backend_url, args).await;
} else if let SubCmd::Schedule(args) = command {
return cmd::schedule::execute(&backend_url, args).await;
}
let client = kanade_shared::nats_client::connect(&server).await?;
debug!("connected to NATS");
match command {
SubCmd::Run(args) => cmd::run::execute(client, args).await,
SubCmd::Ping(args) => cmd::ping::execute(client, args).await,
SubCmd::Jetstream(args) => cmd::jetstream::execute(client, args).await,
SubCmd::Revoke(args) => cmd::revoke::revoke(client, args).await,
SubCmd::Unrevoke(args) => cmd::revoke::unrevoke(client, args).await,
SubCmd::Kill(args) => cmd::kill::execute(client, args).await,
SubCmd::Agent(args) => cmd::agent::execute(client, args).await,
SubCmd::Config(args) => cmd::config::execute(client, args).await,
SubCmd::Group(args) => cmd::group::execute(client, args).await,
SubCmd::Deploy(_) | SubCmd::Schedule(_) => unreachable!("handled above"),
}
}