use anyhow::Result;
use clap::{CommandFactory, Parser, Subcommand};
use tonin::commands;
#[derive(Parser)]
#[command(
name = "tonin",
version,
about = "Build gRPC microservices for Kubernetes — the tonin CLI",
long_about = "The tonin CLI scaffolds gRPC microservices, runs codegen, \
and renders Kubernetes manifests for them.
COMMON WORKFLOWS
Scaffold and run locally:
tonin service new greeter # creates ./greeter/ with proto + impl
cd greeter
cargo run -p greeter # boots gRPC + MCP locally
Render manifests and apply to a cluster:
tonin k8s generate # writes ./k8s/*.yaml from tonin.toml
tonin k8s validate # server-side dry-run via kubectl
tonin k8s apply # actually applies to the current context
Workspace-wide deploy:
tonin k8s apply --workspace --path ./services
INTROSPECTION FOR CODING AGENTS
Every subcommand supports `--help` (short) and `--long-help` is what's
printed when you pass --help to a leaf command. For a machine-readable
manifest of every command + arg + prerequisite, use:
tonin describe # text
tonin describe --format json # JSON
The JSON shape is documented at the top of `tonin describe --help`.
ENVIRONMENT
TONIN_ENV Default overlay env for k8s render (overlaid by --env).
TONIN_TELEMETRY Set to 'off' to disable OTLP exports in scaffolded svcs.
OTEL_EXPORTER_OTLP_ENDPOINT Where scaffolded services send traces.
SEE ALSO
docs/00-overview.md — landing page for capability docs.
https://github.com/Rushit/tonin — source, issues, releases."
)]
struct Cli {
#[command(subcommand)]
cmd: TopCmd,
}
#[derive(Subcommand)]
enum TopCmd {
K8s {
#[command(subcommand)]
cmd: commands::k8s::K8sCmd,
},
Proto {
#[command(subcommand)]
cmd: commands::proto::ProtoCmd,
},
Service {
#[command(subcommand)]
cmd: commands::service::ServiceCmd,
},
Describe(commands::describe::DescribeArgs),
}
fn main() -> Result<()> {
tracing_subscriber::fmt()
.with_env_filter(
tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("info")),
)
.with_target(false)
.init();
let cli = Cli::parse();
match cli.cmd {
TopCmd::K8s { cmd } => commands::k8s::run(cmd),
TopCmd::Proto { cmd } => commands::proto::run(cmd),
TopCmd::Service { cmd } => commands::service::run(cmd),
TopCmd::Describe(args) => commands::describe::run(args, &Cli::command()),
}
}