use anyhow::Result;
use clap::{Args, Subcommand};
use runemark::ColorMode;
use std::io::Write;
use std::path::PathBuf;
use crate::budget_command::run_budget;
use crate::doctor_command::run_doctor;
use crate::inspect_command::run_inspect;
use crate::registry_command::run_registry;
use crate::report::{OutputFormat, parse_size_string};
use crate::toolchains_command::run_toolchains;
#[derive(Debug, Subcommand)]
pub enum Command {
Inspect(InspectArgs),
Project(ProjectArgs),
Doctor(DoctorArgs),
Registry(RegistryArgs),
Toolchains(ToolchainsArgs),
Budget(BudgetArgs),
}
#[derive(Debug, Args)]
pub struct InspectArgs {
pub path: Option<PathBuf>,
}
#[derive(Debug, Args)]
pub struct ProjectArgs {
pub path: PathBuf,
}
#[derive(Debug, Args)]
pub struct DoctorArgs {
pub path: Option<PathBuf>,
}
#[derive(Debug, Args)]
pub struct RegistryArgs {
pub path: Option<PathBuf>,
}
#[derive(Debug, Args)]
pub struct ToolchainsArgs {
pub path: Option<PathBuf>,
}
#[derive(Debug, Args)]
pub struct BudgetArgs {
pub path: Option<PathBuf>,
#[arg(long)]
pub limit: Option<String>,
}
impl Command {
pub fn run(
self,
output_format: OutputFormat,
color_mode: ColorMode,
dry_run: bool,
auto_confirm: bool,
out: &mut dyn Write,
) -> Result<()> {
match self {
Command::Inspect(args) => {
let root = args.path.unwrap_or_else(|| PathBuf::from("."));
run_inspect(&root, output_format, color_mode, out)
}
Command::Project(args) => {
anyhow::bail!(
"project cleanup must be dispatched through the main CLI: {}",
args.path.display()
)
}
Command::Doctor(args) => {
let root = args.path.unwrap_or_else(|| PathBuf::from("."));
run_doctor(&root, output_format, color_mode, out)
}
Command::Registry(args) => {
let root = args.path.unwrap_or_else(|| PathBuf::from("."));
run_registry(&root, dry_run, auto_confirm, output_format, color_mode, out)
}
Command::Toolchains(args) => {
let root = args.path.unwrap_or_else(|| PathBuf::from("."));
run_toolchains(&root, output_format, color_mode, out)
}
Command::Budget(args) => {
let root = args.path.unwrap_or_else(|| PathBuf::from("."));
let limit_bytes = parse_size_string(args.limit.as_deref())?;
run_budget(&root, limit_bytes, output_format, color_mode, out)
}
}
}
}