use std::path::PathBuf;
use clap::Parser;
use crate::explain::Format;
use crate::pattern;
use crate::pulse::HeartbeatOpts;
use crate::walk::EntryType;
#[derive(Parser, Debug)]
#[command(
name = "ct-search",
version,
about = "Recursively find files by name, type, size, and content from a chosen root.",
long_about = "ct-search combines the predicates you would otherwise assemble from find, xargs, \
and grep into one declarative command (also reachable as `ct search`). An entry \
matches only when every supplied predicate holds. See `ct-search --explain` for \
agent-oriented documentation."
)]
#[command(group = clap::ArgGroup::new("output_mode")
.args(["list", "summary", "detail", "quiet"])
.multiple(false))]
pub struct Cli {
#[arg(long, default_value = ".")]
pub base: PathBuf,
#[arg(long)]
pub name: Option<String>,
#[arg(long, value_enum, value_delimiter = ',')]
pub r#type: Vec<EntryType>,
#[arg(long)]
pub grep: Option<String>,
#[arg(long, value_enum)]
pub mode: Option<pattern::Mode>,
#[arg(long)]
pub size: Option<String>,
#[arg(long)]
pub hidden: bool,
#[arg(long)]
pub follow: bool,
#[arg(long)]
pub limit: Option<usize>,
#[arg(long, value_name = "SECS")]
pub timeout: Option<f64>,
#[command(flatten)]
pub heartbeat: HeartbeatOpts,
#[arg(long)]
pub question: Option<String>,
#[arg(long)]
pub expect: Option<String>,
#[arg(long, alias = "emit-stdout")]
pub emit: Option<String>,
#[arg(long)]
pub emit_stderr: Option<String>,
#[arg(long)]
pub list: bool,
#[arg(long)]
pub summary: bool,
#[arg(long)]
pub detail: bool,
#[arg(long)]
pub quiet: bool,
#[arg(long)]
pub json: bool,
#[arg(long, value_enum, num_args = 0..=1, default_missing_value = "md")]
pub explain: Option<Format>,
}