1use std::path::PathBuf;
4
5use crate::{
6 backends::Backend,
7 colorspaces::ColorSpace,
8 palettes::Palette,
9 themes::Schemes,
10};
11
12use clap::{Parser, Subcommand};
13use serde::Deserialize;
14
15#[derive(Debug, Parser, Default)]
17pub struct Globals {
18 #[arg(global = true, short = 'I', long, value_delimiter = ',', conflicts_with = "skip_sequences")]
20 pub ignore_sequence: Option<Vec<Sequences>>,
21
22 #[arg(global = true, short, long)]
24 pub quiet: bool,
25
26 #[arg(global = true, short, long)]
28 #[arg(global = true, short, long, conflicts_with = "update_current", conflicts_with = "ignore_sequence")]
29 pub skip_sequences: bool,
30
31 #[arg(global = true, short = 'T', long)]
33 pub skip_templates: bool,
34
35 #[arg(global = true, short, long, conflicts_with = "skip_sequences")]
37 pub update_current: bool,
38
39 #[arg(global = true, short = 'C', long, conflicts_with = "config_dir")]
41 pub config_file: Option<PathBuf>,
42
43 #[arg(global = true, short = 'd', long, conflicts_with = "config_file", conflicts_with = "templates_dir")]
45 pub config_dir: Option<PathBuf>,
46
47 #[arg(global = true, long, conflicts_with = "config_dir")]
49 pub templates_dir: Option<PathBuf>,
50
51 #[arg(global = true, short = 'N', long, conflicts_with = "config_file", conflicts_with = "config_dir")]
53 pub no_config: bool,
54}
55
56#[derive(Debug, Parser)]
57pub struct Cli {
58 #[clap(flatten)]
59 pub globals: Globals,
60
61 #[clap(subcommand)]
62 pub subcmds: Subcmds,
63}
64
65
66#[derive(Debug, Subcommand, Clone)]
68#[command(about, long_about,
69 version = include!(concat!(env!("OUT_DIR"), "/version.rs")),
70 after_help = format!("Remember to read man pages (man wallust.1, man wallust.5, ..)\nAnd the new v3 spec at {}", crate::config::V3),
71 )]
72pub enum Subcmds {
73 Run(WallustArgs),
75 Cs {
77 colorscheme: String,
79
80 #[arg(short, long)]
83 format: Option<Schemes>,
84 },
85
86 #[cfg(feature = "themes")]
88 Theme {
89 #[arg(value_parser = include!(concat!(env!("OUT_DIR"), "/args.rs")))]
93 theme: String,
94
95 #[arg(short, long)]
97 preview: bool,
98 },
99 Migrate,
101 Debug,
103
104 Pywal(PywalArgs),
106
107}
108
109#[derive(Parser, Debug, Clone, Default)]
111pub struct WallustArgs {
112 pub file: PathBuf,
114
115 #[arg(short, long, value_parser = 0..=100)]
117 pub alpha: Option<i64>,
118
119 #[arg(short, long, value_enum)]
121 pub backend: Option<Backend>,
122
123 #[arg(short, long, value_enum)]
125 pub colorspace: Option<ColorSpace>,
126
127 #[arg(short, long, value_enum)]
129 pub fallback_generator: Option<crate::colorspaces::FallbackGenerator>,
130
131 #[arg(short = 'k', long)]
133 pub check_contrast: bool,
134
135 #[arg(short, long)]
137 pub no_cache: bool,
138
139 #[arg(short, long, value_enum)]
141 pub palette: Option<Palette>,
142
143 #[arg(long, value_parser = 1..=100)]
145 pub saturation: Option<i64>,
146
147 #[arg(short, long, value_parser = 1..=100)]
149 pub threshold: Option<i64>,
150
151 #[arg(long, conflicts_with = "threshold")]
153 pub dynamic_threshold: bool,
154
155 #[arg(short = 'w', long)]
158 pub overwrite_cache: bool,
159}
160
161#[derive(Parser, Debug, Clone, Default)]
164#[command(about, long_about)]
165pub struct PywalArgs {
166 #[arg(short, value_name = "alpha")]
168 pub alpha: Option<String>,
169
170 #[arg(short, value_name = "background")]
172 pub background: Option<String>,
173
174 #[arg(long, value_name = "[backend]")]
176 pub backend: Option<String>,
177
178 #[arg(short = 'f', long, value_name = "theme")]
181 pub theme: Option<String>,
182
183 #[arg(long)]
185 pub iterative: bool,
186
187 #[arg(long, value_name = "0.0 - 1.0")]
189 pub saturate: Option<f32>,
190
191 #[arg(long)]
193 pub preview: bool,
194
195 #[arg(long)]
197 vte: bool,
198
199 #[arg(short = 'c')]
201 pub clean_cache: bool,
202
203 #[arg(required_unless_present = "theme")]
205 #[arg(short = 'i', value_name = "/path/to/img.jpg")]
206 pub file: Option<PathBuf>,
207
208 #[arg(short = 'l')]
210 pub light: bool,
211
212 #[arg(short = 'n')]
214 pub no_wallpaper: bool,
215
216 #[arg(short = 'o', value_name = "script_name")]
218 pub othercmd: Option<String>,
219
220 #[arg(short = 'q')]
222 pub quiet: bool,
223
224 #[arg(short = 'r')]
226 pub r: bool,
227
228 #[arg(short = 'R')]
230 pub restore: bool,
231
232 #[arg(short = 's')]
234 pub skip_sequences: bool,
235
236 #[arg(short = 't')]
238 pub tty: bool,
239
240 #[arg(short = 'v')]
242 pub version: bool,
243
244 #[arg(short = 'e')]
246 pub e: bool,
247}
248
249impl From<PywalArgs> for WallustArgs {
251 fn from(p: PywalArgs) -> Self {
252 Self {
253 alpha: None,
255 backend: None,
256 colorspace: None,
257 check_contrast: false,
258 dynamic_threshold: true,
259 fallback_generator: None,
260 no_cache: false,
261 overwrite_cache: false,
262 palette: None,
263 saturation: None,
264 threshold: None,
265 file: p.file.expect("ALWAYS SOME, CHECKED ON MAIN"),
266 }
267 }
268}
269
270#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, clap::ValueEnum)]
271#[serde(rename_all = "lowercase")]
272pub enum Sequences {
273 Background,
274 Foreground,
275 Cursor,
276 Color0,
277 Color1,
278 Color2,
279 Color3,
280 Color4,
281 Color5,
282 Color6,
283 Color7,
284 Color8,
285 Color9,
286 Color10,
287 Color11,
288 Color12,
289 Color13,
290 Color14,
291 Color15,
292}