summaryrefslogtreecommitdiffstats
path: root/src/cli/args.rs
diff options
context:
space:
mode:
authorCanop <cano.petrole@gmail.com>2022-06-15 07:47:48 +0200
committerCanop <cano.petrole@gmail.com>2022-06-15 07:47:48 +0200
commit282fbc584554bc7db4d06e603cd05961ee2f060f (patch)
treeaee4509c5dc976cfbb48b52232a2a7ff538f9820 /src/cli/args.rs
parent37201de6954d751451d010b8a97977c6da76d08f (diff)
use clap derive for arguments
Diffstat (limited to 'src/cli/args.rs')
-rw-r--r--src/cli/args.rs200
1 files changed, 200 insertions, 0 deletions
diff --git a/src/cli/args.rs b/src/cli/args.rs
new file mode 100644
index 0000000..9ad810e
--- /dev/null
+++ b/src/cli/args.rs
@@ -0,0 +1,200 @@
+use {
+ std::{
+ path::PathBuf,
+ str::FromStr,
+ },
+};
+
+#[derive(Debug, clap::Parser)]
+/// A tree explorer and a customizable launcher
+///
+/// Complete documentation lives at https://dystroy.org/broot"
+#[clap(author, version, about)]
+pub struct Args {
+
+ /// Show the last modified date of files and directories"
+ #[clap(short, long, action)]
+ pub dates: bool,
+
+ /// Don't show the last modified date"
+ #[clap(short='D', long, action)]
+ pub no_dates: bool,
+
+ #[clap(short='f', long, action)]
+ /// Only show folders
+ pub only_folders: bool,
+
+ /// Show folders and files alike
+ #[clap(short='F', long, action)]
+ pub no_only_folders: bool,
+
+ /// Show filesystem info on top
+ #[clap(long, action)]
+ pub show_root_fs: bool,
+
+ /// Show git statuses on files and stats on repo
+ #[clap(short='g', long, action)]
+ pub show_git_info: bool,
+
+ /// Don't show git statuses on files and stats on repo
+ #[clap(short='G', long, action)]
+ pub no_show_git_info: bool,
+
+ #[clap(long, action)]
+ /// Only show files having an interesting git status, including hidden ones
+ pub git_status: bool,
+
+ #[clap(short='h', long, action)]
+ /// Show hidden files
+ pub hidden: bool,
+
+ #[clap(short='H', long, action)]
+ /// Don't show hidden files
+ pub no_hidden: bool,
+
+ #[clap(short='i', long, action)]
+ /// Show git ignored files
+ pub git_ignored: bool,
+
+ #[clap(short='I', long, action)]
+ /// Don't show git ignored files
+ pub no_git_ignored: bool,
+
+ #[clap(short='p', long, action)]
+ /// Show permissions
+ pub permissions: bool,
+
+ #[clap(short='P', long, action)]
+ /// Don't show permissions
+ pub no_permissions: bool,
+
+ #[clap(short='s', long, action)]
+ /// Show the size of files and directories
+ pub sizes: bool,
+
+ #[clap(short='S', long, action)]
+ /// Don't show sizes
+ pub no_sizes: bool,
+
+ #[clap(long, action)]
+ /// Sort by count (only show one level of the tree)
+ pub sort_by_count: bool,
+
+ #[clap(long, action)]
+ /// Sort by date (only show one level of the tree)
+ pub sort_by_date: bool,
+
+ #[clap(long, action)]
+ /// Sort by size (only show one level of the tree)
+ pub sort_by_size: bool,
+
+ /// Sort by size, show ignored and hidden files
+ #[clap(short, long, action)]
+ pub whale_spotting: bool,
+
+ /// Don't sort
+ #[clap(long, action)]
+ pub no_sort: bool,
+
+ /// Trim the root too and don't show a scrollbar
+ #[clap(short='t', long, action)]
+ pub trim_root: bool,
+
+ /// Don't trim the root level, show a scrollbar
+ #[clap(short='T', long, action)]
+ pub no_trim_root: bool,
+
+ /// Where to write the produced cmd (if any)
+ #[clap(long, value_parser)]
+ pub cmd_export_path: Option<PathBuf>,
+
+ /// Semicolon separated commands to execute
+ #[clap(short, long, value_parser)]
+ pub commands: Option<String>,
+
+ /// Whether to have styles and colors (auto is default and usually OK)
+ #[clap(long, arg_enum, value_parser, default_value="auto")]
+ pub color: TriBool,
+
+ /// Semicolon separated paths to specific config files"),
+ #[clap(long, value_parser)]
+ pub conf: Option<String>,
+
+ /// Height (if you don't want to fill the screen or for file export)
+ #[clap(long, value_parser)]
+ pub height: Option<u16>,
+
+ /// Install or reinstall the br shell function
+ #[clap(long, action)]
+ pub install: bool,
+
+ /// Where to write the produced cmd (if any)
+ #[clap(long, value_parser)]
+ pub set_install_state: Option<ShellInstallState>,
+
+ /// Print to stdout the br function for a given shell
+ #[clap(long, value_parser)]
+ pub print_shell_function: Option<String>,
+
+ /// A socket to listen to for commands
+ #[cfg(unix)]
+ #[clap(long, value_parser)]
+ pub listen: Option<String>,
+
+ /// Ask for the current root of the remote broot
+ #[cfg(unix)]
+ #[clap(long, action)]
+ pub get_root: bool,
+
+ /// A socket that broot sends commands to before quitting
+ #[cfg(unix)]
+ #[clap(long, value_parser)]
+ pub send: Option<String>,
+
+ /// Root Directory
+ #[clap(value_parser, value_name="FILE")]
+ pub root: Option<PathBuf>,
+}
+
+/// This is an Option<bool> but I didn't find any way to configure
+/// clap to parse an Option<T> as I want
+#[derive(Debug, Clone, Copy, PartialEq, Eq, clap::ArgEnum)]
+pub enum TriBool {
+ Auto,
+ Yes,
+ No,
+}
+impl TriBool {
+ pub fn unwrap_or_else<F>(self, f: F) -> bool
+ where
+ F: FnOnce() -> bool
+ {
+ match self {
+ Self::Auto => f(),
+ Self::Yes => true,
+ Self::No => false,
+ }
+ }
+}
+
+#[derive(Debug, Clone, Copy, clap::ValueEnum)]
+pub enum ShellInstallState {
+ Undefined, // before any install, this is the initial state
+ Refused,
+ Installed,
+}
+impl FromStr for ShellInstallState {
+ type Err = String;
+ fn from_str(state: &str) -> Result<Self, Self::Err> {
+ match state {
+ "undefined" => Ok(Self::Undefined),
+ "refused" => Ok(Self::Refused),
+ "installed" => Ok(Self::Installed),
+ _ => Err(
+ // not supposed to happen because claps check the values
+ format!("unexpected install state: {:?}", state)
+ ),
+ }
+ }
+}
+