coding_tools/cli/
ct_tree.rs1use std::path::PathBuf;
8
9use clap::Parser;
10
11use crate::explain::Format;
12use crate::pattern;
13use crate::pulse::HeartbeatOpts;
14
15#[derive(Parser, Debug)]
16#[command(
17 name = "ct-tree",
18 version,
19 about = "Report a file tree with per-file line/word/char counts, filtered, sorted, and summarised.",
20 long_about = "ct-tree walks a directory for chosen file types and reports the effective tree with \
21 per-file line, word, and character counts (also reachable as `ct tree`). Filter by \
22 metric predicates (--min-lines etc.) and per-folder counts, sort by any column, and \
23 choose a summarisation level (--tree, --flat, --summary). See `ct-tree --explain` \
24 for agent-oriented documentation."
25)]
26#[command(group = clap::ArgGroup::new("output_mode")
27 .args(["tree", "flat", "summary"])
28 .multiple(false))]
29pub struct Cli {
30 #[arg(long, default_value = ".")]
32 pub base: PathBuf,
33
34 #[arg(long)]
36 pub name: Option<String>,
37
38 #[arg(long, value_enum)]
40 pub mode: Option<pattern::Mode>,
41
42 #[arg(long, value_delimiter = ',')]
44 pub ext: Vec<String>,
45
46 #[arg(long)]
48 pub hidden: bool,
49
50 #[arg(long)]
52 pub follow: bool,
53
54 #[arg(long)]
56 pub no_ignore: bool,
57
58 #[arg(long)]
60 pub min_lines: Option<u64>,
61 #[arg(long)]
63 pub max_lines: Option<u64>,
64 #[arg(long)]
66 pub min_words: Option<u64>,
67 #[arg(long)]
69 pub max_words: Option<u64>,
70 #[arg(long)]
72 pub min_chars: Option<u64>,
73 #[arg(long)]
75 pub max_chars: Option<u64>,
76
77 #[arg(long)]
79 pub min_files_per_folder: Option<usize>,
80 #[arg(long)]
82 pub max_files_per_folder: Option<usize>,
83
84 #[arg(long, value_enum, default_value_t = SortKey::Path)]
86 pub sort: SortKey,
87 #[arg(long)]
89 pub desc: bool,
90
91 #[arg(long)]
93 pub tree: bool,
94 #[arg(long)]
96 pub flat: bool,
97 #[arg(long)]
99 pub summary: bool,
100
101 #[arg(long, value_enum, default_value_t = GroupBy::Ext)]
103 pub group: GroupBy,
104
105 #[arg(long)]
107 pub json: bool,
108
109 #[arg(long)]
111 pub json_pretty: bool,
112
113 #[arg(long, value_name = "SECS")]
115 pub timeout: Option<f64>,
116
117 #[command(flatten)]
118 pub heartbeat: HeartbeatOpts,
119
120 #[arg(long, value_enum, num_args = 0..=1, default_missing_value = "md")]
122 pub explain: Option<Format>,
123}
124
125#[derive(Debug, Clone, Copy, PartialEq, Eq, clap::ValueEnum)]
126pub enum SortKey {
127 Path,
128 Name,
129 Lines,
130 Words,
131 Chars,
132 Ext,
133}
134
135#[derive(Debug, Clone, Copy, PartialEq, Eq, clap::ValueEnum)]
136pub enum GroupBy {
137 Ext,
138 Dir,
139 None,
140}