1 use std::{ffi::OsString, path::PathBuf};
3 use clap::{Parser, ValueHint};
5 // Ouch command line options (docstrings below are part of --help)
6 /// A command-line utility for easily compressing and decompressing files and directories.
8 /// Supported formats: tar, zip, gz, xz/lzma, bz/bz2, lz4, sz, zst.
10 /// Repository: https://github.com/ouch-org/ouch
11 #[derive(Parser, Debug)]
12 #[command(about, version)]
13 // Disable rustdoc::bare_urls because rustdoc parses URLs differently than Clap
14 #[allow(rustdoc::bare_urls)]
16 /// Skip [Y/n] questions positively
17 #[arg(short, long, conflicts_with = "no", global = true)]
20 /// Skip [Y/n] questions negatively
21 #[arg(short, long, global = true)]
24 /// Activate accessibility mode, reducing visual noise
25 #[arg(short = 'A', long, env = "ACCESSIBLE", global = true)]
28 /// Ignores hidden files
29 #[arg(short = 'H', long, global = true)]
33 #[arg(short = 'q', long, global = true)]
36 /// Ignores files matched by git's ignore files
37 #[arg(short = 'g', long, global = true)]
40 /// Specify the format of the archive
41 #[arg(short, long, global = true)]
42 pub format: Option<OsString>,
44 /// Ouch and claps subcommands
45 #[command(subcommand)]
49 #[derive(Parser, PartialEq, Eq, Debug)]
50 #[allow(rustdoc::bare_urls)]
52 /// Compress one or more files into one output file
53 #[command(visible_alias = "c")]
55 /// Files to be compressed
56 #[arg(required = true, value_hint = ValueHint::FilePath)]
59 /// The resulting file. Its extensions can be used to specify the compression formats
60 #[arg(required = true, value_hint = ValueHint::FilePath)]
63 /// Compression level, applied to all formats
64 #[arg(short, long, group = "compression-level")]
67 /// Fastest compression level possible,
68 /// conflicts with --level and --slow
69 #[arg(long, group = "compression-level")]
72 /// Slowest (and best) compression level possible,
73 /// conflicts with --level and --fast
74 #[arg(long, group = "compression-level")]
77 /// Decompresses one or more files, optionally into another folder
78 #[command(visible_alias = "d")]
80 /// Files to be decompressed
81 #[arg(required = true, num_args = 1.., value_hint = ValueHint::FilePath)]
84 /// Place results in a directory other than the current one
85 #[arg(short = 'd', long = "dir", value_hint = ValueHint::FilePath)]
86 output_dir: Option<PathBuf>,
88 /// List contents of an archive
89 #[command(visible_aliases = ["l", "ls"])]
91 /// Archives whose contents should be listed
92 #[arg(required = true, num_args = 1.., value_hint = ValueHint::FilePath)]
93 archives: Vec<PathBuf>,
95 /// Show archive contents as a tree