Skip to content

Commit 4c164aa

Browse files
committed
Quality and verbose validation
1 parent c1d077c commit 4c164aa

File tree

4 files changed

+45
-32
lines changed

4 files changed

+45
-32
lines changed

Cargo.lock

+13-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ repository = "https://github.com/Lymphatus/caesium-clt"
1717
[dependencies]
1818
indicatif = { version = "0.17", features = ["rayon"] }
1919
walkdir = "2.5"
20-
infer = "0.16"
20+
infer = "0.19"
2121
rayon = "1.10"
2222
human_bytes = { version = "0.4", default-features = false }
2323
kamadak-exif = "0.6"
2424
imagesize = "0.13"
25-
libcaesium = "0.17.1"
25+
libcaesium = "0.17.2"
2626
clap = { version = "4.5", features = ["derive"] }
2727

2828
[dev-dependencies]

src/main.rs

+9-10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use crate::compressor::{start_compression, CompressionOptions, CompressionResult, CompressionStatus};
2-
use crate::options::VerboseLevel::{All, Progress, Quiet};
3-
use crate::options::{CommandLineArgs, VerboseLevel};
2+
use crate::options::CommandLineArgs;
43
use crate::scan_files::scan_files;
54
use clap::Parser;
65
use human_bytes::human_bytes;
@@ -27,8 +26,8 @@ fn main() {
2726
.build_global()
2827
.unwrap_or_default();
2928

30-
let quiet = args.quiet || args.verbose == Quiet;
31-
let verbose = if quiet { Quiet } else { args.verbose };
29+
let quiet = args.quiet || args.verbose == 0;
30+
let verbose = if quiet { 0 } else { args.verbose };
3231
let (base_path, input_files) = scan_files(&args.files, args.recursive, quiet);
3332
let total_files = input_files.len();
3433

@@ -39,7 +38,7 @@ fn main() {
3938
write_recap_message(&compression_results, verbose);
4039
}
4140

42-
fn write_recap_message(compression_results: &[CompressionResult], verbose: VerboseLevel) {
41+
fn write_recap_message(compression_results: &[CompressionResult], verbose: u8) {
4342
let mut total_original_size = 0;
4443
let mut total_compressed_size = 0;
4544
let total_files = compression_results.len();
@@ -56,8 +55,8 @@ fn write_recap_message(compression_results: &[CompressionResult], verbose: Verbo
5655
_ => total_success += 1,
5756
}
5857

59-
if verbose > Progress {
60-
if verbose < All && matches!(result.status, CompressionStatus::Success) {
58+
if verbose > 1 {
59+
if verbose < 3 && matches!(result.status, CompressionStatus::Success) {
6160
continue;
6261
}
6362
println!(
@@ -80,7 +79,7 @@ fn write_recap_message(compression_results: &[CompressionResult], verbose: Verbo
8079
let total_saved = total_original_size as f64 - total_compressed_size as f64;
8180
let total_saved_percent = total_saved / total_original_size as f64 * 100.0;
8281

83-
if verbose > Quiet {
82+
if verbose > 0 {
8483
println!(
8584
"Compressed {} files ({} success, {} skipped, {} errors)\n{} -> {} [Saved {} ({:.2}%)]",
8685
total_files,
@@ -103,9 +102,9 @@ fn get_parallelism_count(requested_threads: u32, available_threads: usize) -> us
103102
}
104103
}
105104

106-
fn setup_progress_bar(len: usize, verbose: VerboseLevel) -> ProgressBar {
105+
fn setup_progress_bar(len: usize, verbose: u8) -> ProgressBar {
107106
let progress_bar = ProgressBar::new(len as u64);
108-
if verbose == Quiet {
107+
if verbose == 0 {
109108
progress_bar.set_draw_target(ProgressDrawTarget::hidden());
110109
} else {
111110
progress_bar.set_draw_target(ProgressDrawTarget::stdout());

src/options.rs

+21-16
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,6 @@ pub enum OutputFormat {
1919
Tiff,
2020
Original,
2121
}
22-
23-
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum, Debug)]
24-
pub enum VerboseLevel {
25-
/// Suppress all output
26-
Quiet = 0,
27-
/// Show only progress and final results
28-
Progress = 1,
29-
/// Show also skipped and error messages
30-
WarningsAndErrors = 2,
31-
/// Print all
32-
All = 3,
33-
}
34-
3522
#[derive(Parser, Debug)]
3623
#[command(version, about, long_about = None)]
3724
pub struct CommandLineArgs {
@@ -93,8 +80,8 @@ pub struct CommandLineArgs {
9380
pub quiet: bool,
9481

9582
/// select how much output you want to see
96-
#[arg(long, value_enum, default_value = "progress", group = "verbosity")]
97-
pub verbose: VerboseLevel,
83+
#[arg(long, default_value = "1", group = "verbosity", value_parser = verbose_validator)]
84+
pub verbose: u8,
9885

9986
pub files: Vec<String>,
10087
}
@@ -103,7 +90,7 @@ pub struct CommandLineArgs {
10390
#[group(required = true, multiple = false)]
10491
pub struct Compression {
10592
/// sets output file quality between [0-100]
106-
#[arg(short, long)]
93+
#[arg(short, long, value_parser = quality_validator)]
10794
pub quality: Option<u32>,
10895

10996
/// perform lossless compression
@@ -146,3 +133,21 @@ pub struct OutputDestination {
146133
#[arg(long, default_value = "false", group = "output_destination")]
147134
pub same_folder_as_input: bool,
148135
}
136+
137+
fn quality_validator(val: &str) -> Result<u32, String> {
138+
let value: u32 = val.parse().map_err(|_| format!("`{}` is not a valid number", val))?;
139+
if value > 100 {
140+
Err(format!("Quality must be between 0 and 100, but found `{}`", value))
141+
} else {
142+
Ok(value)
143+
}
144+
}
145+
146+
fn verbose_validator(val: &str) -> Result<u8, String> {
147+
let value: u8 = val.parse().map_err(|_| format!("`{}` is not a valid number", val))?;
148+
if value > 3 {
149+
Err(format!("Verbosity must be between 0 and 3, but found `{}`", value))
150+
} else {
151+
Ok(value)
152+
}
153+
}

0 commit comments

Comments
 (0)