1use clap::{Parser, Subcommand, Args, ArgAction};
2use std::path::PathBuf;
3
4pub mod handler;
5
6#[derive(Parser)]
7#[command(
8 name = "pocket",
9 about = "A CLI tool for saving, organizing, and retrieving code snippets with integrated version control",
10 version = env!("CARGO_PKG_VERSION"),
11 author
12)]
13pub struct Cli {
14 #[arg(short, long, action = ArgAction::Count, global = true)]
16 pub verbose: u8,
17
18 #[command(subcommand)]
20 pub command: Commands,
21}
22
23#[derive(Subcommand)]
24pub enum Commands {
25 #[command(about = "Snippet Management Commands")]
26 #[command(visible_alias = "snippet")]
27 Add {
29 #[arg(value_name = "FILE")]
31 file: Option<String>,
32
33 #[arg(short, long, value_name = "TEXT")]
35 message: Option<String>,
36
37 #[arg(short, long)]
39 editor: bool,
40
41 #[arg(short, long, value_name = "NAME")]
43 backpack: Option<String>,
44
45 #[arg(long)]
47 clipboard: bool,
48
49 #[arg(short, long, value_name = "MODEL")]
51 summarize: Option<String>,
52 },
53
54 #[command(about = "Display all pocket entries")]
55 List {
57 #[arg(short = 'a', long)]
59 all: bool,
60
61 #[arg(short, long, value_name = "NAME")]
63 backpack: Option<String>,
64
65 #[arg(long)]
67 json: bool,
68
69 #[arg(short, long, value_name = "N", default_value = "10")]
71 limit: usize,
72 },
73
74 #[command(about = "Remove an entry from storage")]
75 Remove {
77 id: String,
79
80 #[arg(short, long)]
82 force: bool,
83
84 #[arg(short, long, value_name = "NAME")]
86 backpack: Option<String>,
87 },
88
89 #[command(about = "Create a new backpack for organizing entries")]
90 Create {
92 name: String,
94
95 #[arg(short, long, value_name = "TEXT")]
97 description: Option<String>,
98 },
99
100 #[command(about = "Find entries across all backpacks with powerful search algorithms")]
101 Search {
103 query: String,
105
106 #[arg(short, long, value_name = "N", default_value = "10")]
108 limit: usize,
109
110 #[arg(short, long, value_name = "NAME")]
112 backpack: Option<String>,
113
114 #[arg(long)]
116 exact: bool,
117
118 #[arg(short, long)]
120 package: bool,
121 },
122
123 #[command(about = "Insert an entry into a file")]
124 Insert {
126 id: Option<String>,
128
129 file: Option<String>,
131
132 #[arg(short, long)]
134 top: bool,
135
136 #[arg(short = 'f', long)]
138 no_confirm: bool,
139
140 #[arg(short, long, value_name = "TEXT")]
142 delimiter: Option<String>,
143 },
144
145 #[command(about = "Reload all extensions")]
146 Reload,
148
149 #[command(about = "Display help information")]
150 ShowHelp {
152 command: Option<String>,
154
155 #[arg(short, long)]
157 extensions: bool,
158 },
159
160 #[command(about = "Create and execute command chains")]
161 Lint {
163 workflow: Option<String>,
165 },
166
167 #[command(about = "Remove a saved workflow")]
168 DeleteWorkflow {
170 name: String,
172 },
173
174 #[command(about = "Display version information")]
175 Version,
177
178 #[command(about = "Edit an existing entry")]
179 Edit {
181 id: String,
183
184 #[arg(short, long)]
186 force: bool,
187
188 #[arg(short, long, value_name = "NAME")]
190 backpack: Option<String>,
191 },
192
193 #[command(about = "Execute a script")]
194 Execute {
196 name: String,
198
199 args: Vec<String>,
201 },
202
203 #[command(about = "๐ Manage cards")]
204 Cards {
206 #[command(subcommand)]
207 operation: Option<CardOperation>,
208 },
209
210 #[command(about = "๐งช Blend shell scripts into your shell configuration")]
211 Blend {
213 script_file: Option<String>,
215
216 #[arg(short, long)]
218 executable: bool,
219
220 #[command(subcommand)]
221 command: Option<BlendCommands>,
222 },
223}
224
225#[derive(Subcommand)]
226pub enum CardOperation {
227 List {
229 #[arg(short, long)]
231 detail: bool,
232 },
233
234 Enable {
236 name: String,
238 },
239
240 Disable {
242 name: String,
244 },
245
246 Add {
248 name: String,
250
251 url: String,
253 },
254
255 Remove {
257 name: String,
259
260 #[arg(short, long)]
262 force: bool,
263 },
264
265 Build {
267 name: String,
269
270 #[arg(short, long)]
272 release: bool,
273 },
274
275 Create {
277 name: String,
279
280 #[arg(short, long)]
282 description: String,
283 },
284}
285
286#[derive(Subcommand)]
287pub enum BlendCommands {
288 Edit {
290 hook_name: String,
292 },
293
294 List,
296
297 Run {
299 hook_name: String,
301
302 args: Vec<String>,
304 },
305}