use std::path::PathBuf;
use clap::{Args, Parser, Subcommand};
use crate::config::OutputFormat;
#[derive(Debug, Parser)]
#[command(
name = "dirpack",
version,
about = "Create budgeted directory indexes for AI coding agents",
propagate_version = true
)]
pub struct Cli {
#[command(subcommand)]
pub command: Option<Commands>,
}
#[derive(Debug, Subcommand)]
pub enum Commands {
Pack(PackArgs),
Init(InitArgs),
Tree(TreeArgs),
Eval(EvalArgs),
}
#[derive(Debug, Args, Clone)]
pub struct PackArgs {
#[arg(value_name = "PATH", default_value = ".")]
pub path: PathBuf,
#[arg(short = 't', long = "target-tokens", value_name = "N", conflicts_with = "target_bytes")]
pub target_tokens: Option<usize>,
#[arg(short = 'b', long = "target-bytes", value_name = "N", conflicts_with = "target_tokens")]
pub target_bytes: Option<usize>,
#[arg(short = 'o', long = "output", value_name = "FILE")]
pub output: Option<PathBuf>,
#[arg(long = "root-label", value_name = "LABEL")]
pub root_label: Option<String>,
#[arg(short = 'f', long = "format", value_name = "FORMAT")]
pub format: Option<OutputFormat>,
#[arg(short = 'c', long = "config", value_name = "FILE")]
pub config: Option<PathBuf>,
#[arg(short = 'd', long = "depth", value_name = "N")]
pub depth: Option<usize>,
#[arg(short = 'e', long = "exclude", value_name = "PATTERN", action = clap::ArgAction::Append)]
pub exclude: Vec<String>,
#[arg(short = 'i', long = "include", value_name = "PATTERN", action = clap::ArgAction::Append)]
pub include: Vec<String>,
#[arg(long = "no-git")]
pub no_git: bool,
#[arg(long = "no-signatures")]
pub no_signatures: bool,
#[arg(long = "title", value_name = "TITLE")]
pub title: Option<String>,
#[arg(short = 'v', long = "verbose")]
pub verbose: bool,
#[arg(long = "timing")]
pub timing: bool,
#[arg(short = 'q', long = "quiet")]
pub quiet: bool,
}
impl Default for PackArgs {
fn default() -> Self {
Self {
path: PathBuf::from("."),
target_tokens: None,
target_bytes: None,
output: None,
root_label: None,
format: None,
config: None,
depth: None,
exclude: Vec::new(),
include: Vec::new(),
no_git: false,
no_signatures: false,
title: None,
verbose: false,
timing: false,
quiet: false,
}
}
}
#[derive(Debug, Args, Clone)]
pub struct InitArgs {
#[arg(short = 'o', long = "output", value_name = "FILE", default_value = "dirpack.toml")]
pub output: PathBuf,
#[arg(long = "global")]
pub global: bool,
#[arg(long = "force")]
pub force: bool,
}
#[derive(Debug, Args, Clone)]
pub struct TreeArgs {
#[arg(value_name = "PATH", default_value = ".")]
pub path: PathBuf,
#[arg(short = 'd', long = "depth", value_name = "N")]
pub depth: Option<usize>,
#[arg(long = "show-priority")]
pub show_priority: bool,
#[arg(long = "show-category")]
pub show_category: bool,
}
#[derive(Debug, Args, Clone)]
pub struct EvalArgs {
#[arg(value_name = "PATH", default_value = ".")]
pub path: PathBuf,
#[arg(long = "budgets", value_name = "N", value_delimiter = ',', num_args = 1..)]
pub budgets: Vec<usize>,
#[arg(long = "pretty")]
pub pretty: bool,
}