1use {
2 crate::{
3 cols::Cols,
4 filter::Filter,
5 sorting::Sorting,
6 units::Units,
7 },
8 clap::{
9 Parser,
10 ValueEnum,
11 },
12 termimad::crossterm::tty::IsTty,
13};
14
15#[derive(Debug, Parser)]
19#[command(
20 author,
21 about,
22 name = "dysk",
23 disable_version_flag = true,
24 version,
25 disable_help_flag = true
26)]
27pub struct Args {
28 #[arg(long)]
30 pub help: bool,
31
32 #[arg(long)]
34 pub version: bool,
35
36 #[arg(short, long)]
38 pub all: bool,
39
40 #[arg(long, default_value = "auto", value_name = "color")]
42 pub color: TriBool,
43
44 #[arg(long)]
46 pub ascii: bool,
47
48 #[arg(long, default_value = "auto", value_name = "choice")]
50 pub remote_stats: TriBool,
51
52 #[arg(long)]
54 pub list_cols: bool,
55
56 #[arg(
58 short,
59 long,
60 default_value = "fs+type+disk+used+use+free+size+mp",
61 value_name = "columns"
62 )]
63 pub cols: Cols,
64
65 #[arg(short, long, value_name = "expr")]
67 pub filter: Option<Filter>,
68
69 #[arg(short, long, default_value = "size", value_name = "sort")]
71 pub sort: Sorting,
72
73 #[arg(short, long, default_value = "SI", value_name = "unit")]
75 pub units: Units,
76
77 #[arg(short, long)]
79 pub json: bool,
80
81 #[arg(long)]
83 pub csv: bool,
84
85 #[arg(long, default_value = ",", value_name = "sep")]
87 pub csv_separator: char,
88
89 #[arg(long, hide = true)]
91 pub strategy: Option<String>,
92
93 pub path: Option<std::path::PathBuf>,
95}
96
97#[derive(ValueEnum, Debug, Clone, Copy, PartialEq, Eq)]
100pub enum TriBool {
101 Auto,
102 Yes,
103 No,
104}
105impl TriBool {
106 pub fn unwrap_or_else<F>(
107 self,
108 f: F,
109 ) -> bool
110 where
111 F: FnOnce() -> bool,
112 {
113 match self {
114 Self::Auto => f(),
115 Self::Yes => true,
116 Self::No => false,
117 }
118 }
119}
120
121impl Args {
122 pub fn color(&self) -> bool {
123 self.color.unwrap_or_else(|| std::io::stdout().is_tty())
124 }
125}