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, value_name = "SECS")]
111 pub timeout: Option<f64>,
112
113 #[command(flatten)]
114 pub heartbeat: HeartbeatOpts,
115
116 #[arg(long, value_enum, num_args = 0..=1, default_missing_value = "md")]
118 pub explain: Option<Format>,
119}
120
121#[derive(Debug, Clone, Copy, PartialEq, Eq, clap::ValueEnum)]
122pub enum SortKey {
123 Path,
124 Name,
125 Lines,
126 Words,
127 Chars,
128 Ext,
129}
130
131#[derive(Debug, Clone, Copy, PartialEq, Eq, clap::ValueEnum)]
132pub enum GroupBy {
133 Ext,
134 Dir,
135 None,
136}