use std::path::PathBuf;
use clap::{Args, Parser, Subcommand};
#[derive(Debug, Parser)]
#[command(name = "cu-profiler", version, about)]
pub struct Cli {
#[arg(short, long, action = clap::ArgAction::Count, global = true)]
pub verbose: u8,
#[arg(long, global = true, conflicts_with = "verbose")]
pub quiet: bool,
#[arg(long, global = true)]
pub trace: bool,
#[command(subcommand)]
pub command: Command,
}
#[derive(Debug, Subcommand)]
pub enum Command {
Init(InitArgs),
Run(RunArgs),
Compare(CompareArgs),
Baseline(BaselineArgs),
Ci(RunArgs),
Explain(ExplainArgs),
Inspect(InspectArgs),
Import(ImportArgs),
}
#[derive(Debug, Args, Clone)]
pub struct CommonRun {
#[arg(long, default_value = "cu-profiler.toml")]
pub config: PathBuf,
#[arg(long, default_value = ".cu/logs")]
pub logs_dir: PathBuf,
#[arg(long = "scenario")]
pub scenarios: Vec<String>,
#[arg(long = "tag")]
pub tags: Vec<String>,
}
#[derive(Debug, Args, Clone)]
pub struct RunArgs {
#[command(flatten)]
pub common: CommonRun,
#[arg(long, value_parser = ["table", "json", "markdown", "junit", "html"])]
pub format: Option<String>,
#[arg(long)]
pub output: Option<PathBuf>,
#[arg(long)]
pub baseline: Option<PathBuf>,
#[arg(long)]
pub strict: bool,
#[arg(long)]
pub fail_on_budget: bool,
#[arg(long)]
pub fail_on_regression: bool,
#[arg(long)]
pub fail_on_low_confidence: bool,
}
#[derive(Debug, Args, Clone)]
pub struct CompareArgs {
#[command(flatten)]
pub common: CommonRun,
#[arg(long, default_value = ".cu/baseline.json")]
pub baseline: PathBuf,
#[arg(long, value_parser = ["table", "json", "markdown", "junit", "html"])]
pub format: Option<String>,
}
#[derive(Debug, Args)]
pub struct BaselineArgs {
#[command(subcommand)]
pub command: BaselineCommand,
}
#[derive(Debug, Subcommand)]
pub enum BaselineCommand {
Save(BaselineSaveArgs),
Approve(BaselineApproveArgs),
}
#[derive(Debug, Args)]
pub struct BaselineSaveArgs {
#[command(flatten)]
pub common: CommonRun,
#[arg(long, default_value = ".cu/baseline.json")]
pub baseline: PathBuf,
}
#[derive(Debug, Args)]
pub struct BaselineApproveArgs {
pub scenario: String,
#[arg(long, default_value = ".cu/baseline.json")]
pub baseline: PathBuf,
}
#[derive(Debug, Args)]
pub struct ExplainArgs {
pub scenario: String,
#[command(flatten)]
pub common: CommonRun,
}
#[derive(Debug, Args)]
pub struct InspectArgs {
pub report: PathBuf,
#[arg(long, default_value = "table", value_parser = ["table", "json", "markdown", "junit", "html"])]
pub format: String,
}
#[derive(Debug, Args)]
#[command(group(
clap::ArgGroup::new("source").required(true).args(["file", "signature"])
))]
pub struct ImportArgs {
pub file: Option<PathBuf>,
#[arg(long)]
pub signature: Option<String>,
#[arg(long, default_value = "https://api.mainnet-beta.solana.com")]
pub rpc: String,
#[arg(long, default_value = "confirmed", value_parser = ["confirmed", "finalized"])]
pub commitment: String,
#[arg(long)]
pub name: Option<String>,
#[arg(long, default_value = ".cu/logs")]
pub logs_dir: PathBuf,
}
#[derive(Debug, Args)]
pub struct InitArgs {
#[arg(long, default_value = ".")]
pub dir: PathBuf,
#[arg(long)]
pub workflow: bool,
#[arg(long)]
pub force: bool,
}