use clap::{Parser, Subcommand}; use crate::output::OutputFormat; #[derive(Parser)] #[command(name = "stemedb-admin")] #[command(version)] #[command(about = "StemeDB Cluster Administration Tool", long_about = None)] pub struct Cli { /// Gateway address #[arg(long, env = "STEMEDB_GATEWAY_ADDR", default_value = "http://localhost:18181")] pub gateway: String, /// Output format (table, json) #[arg(short, long, default_value = "table")] pub format: OutputFormat, /// Enable verbose logging #[arg(short, long)] pub verbose: bool, #[command(subcommand)] pub command: Commands, } #[derive(Subcommand)] pub enum Commands { /// Cluster operations Cluster { #[command(subcommand)] cmd: ClusterCommands, }, /// Node operations Node { #[command(subcommand)] cmd: NodeCommands, }, /// Shard operations Shard { #[command(subcommand)] cmd: ShardCommands, }, /// Debug operations Debug { #[command(subcommand)] cmd: DebugCommands, }, } #[derive(Subcommand)] pub enum ClusterCommands { /// Show cluster status overview Status, /// Quick health check (exit code 0 if healthy, 1 if unhealthy) Health, } #[derive(Subcommand)] pub enum NodeCommands { /// List all nodes in the cluster List, /// Show detailed information about a specific node Info { /// Node ID (short hex format) node_id: String, }, /// Show shards assigned to a specific node Shards { /// Node ID (short hex format) node_id: String, /// Show only leader shards #[arg(long)] leader: bool, }, } #[derive(Subcommand)] pub enum ShardCommands { /// List all shards List, /// Show detailed information about a specific shard Info { /// Shard ID shard_id: u32, }, /// Show replica nodes for a specific shard Replicas { /// Shard ID shard_id: u32, }, } #[derive(Subcommand)] pub enum DebugCommands { /// Export complete cluster state for debugging Export { /// Output file path #[arg(short, long, default_value = "cluster-state.json")] output: String, }, }