use clap::{Parser, Subcommand, ValueEnum};
use modelexpress_client::{ClientArgs, ModelProvider};
use std::path::PathBuf;
#[derive(Parser)]
#[command(name = "modelexpress-cli")]
#[command(about = "A CLI tool for interacting with ModelExpress server")]
#[command(version)]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
#[command(flatten)]
pub client_args: ClientArgs,
#[arg(long, short = 'f', value_enum, default_value = "human")]
pub format: OutputFormat,
#[arg(short = 'v', action = clap::ArgAction::Count)]
pub verbose: u8,
}
#[derive(Subcommand)]
pub enum Commands {
Health,
Model {
#[command(subcommand)]
command: ModelCommands,
},
Api {
#[command(subcommand)]
command: ApiCommands,
},
}
#[derive(Subcommand)]
pub enum ModelCommands {
Download {
model_name: String,
#[arg(long, short = 'p', value_enum, default_value_t = ModelProvider::HuggingFace)]
provider: ModelProvider,
#[arg(long, short = 's', value_enum, default_value = "smart-fallback")]
strategy: DownloadStrategy,
#[arg(long, short = 'r', value_name = "REVISION")]
revision: Option<String>,
},
Init {
#[arg(long, value_name = "PATH")]
storage_path: Option<PathBuf>,
#[arg(long, value_name = "ENDPOINT")]
server_endpoint: Option<String>,
},
List {
#[arg(long)]
detailed: bool,
},
Status,
Clear {
#[arg(long, short = 'p', value_enum, default_value_t = ModelProvider::HuggingFace)]
provider: ModelProvider,
model_name: String,
},
ClearAll {
#[arg(long)]
yes: bool,
},
Validate {
model_name: Option<String>,
},
Stats {
#[arg(long)]
detailed: bool,
},
}
#[derive(Subcommand)]
pub enum ApiCommands {
Send {
action: String,
#[arg(long, short = 'p')]
payload: Option<String>,
#[arg(long, short = 'f')]
payload_file: Option<String>,
},
}
#[derive(ValueEnum, Clone, Debug, PartialEq)]
pub enum OutputFormat {
Human,
Json,
JsonPretty,
}
#[derive(ValueEnum, Clone, Debug)]
pub enum DownloadStrategy {
#[value(name = "smart-fallback")]
SmartFallback,
#[value(name = "server-only")]
ServerOnly,
#[value(name = "direct")]
Direct,
}