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)]
91 pub strategy: Option<String>,
92
93 #[cfg(unix)]
95 pub path: Option<std::path::PathBuf>,
96}
97
98#[derive(ValueEnum, Debug, Clone, Copy, PartialEq, Eq)]
101pub enum TriBool {
102 Auto,
103 Yes,
104 No,
105}
106impl TriBool {
107 pub fn unwrap_or_else<F>(
108 self,
109 f: F,
110 ) -> bool
111 where
112 F: FnOnce() -> bool,
113 {
114 match self {
115 Self::Auto => f(),
116 Self::Yes => true,
117 Self::No => false,
118 }
119 }
120}
121
122impl Args {
123 pub fn color(&self) -> bool {
124 self.color.unwrap_or_else(|| std::io::stdout().is_tty())
125 }
126}