use clap::builder::TypedValueParser as _;
use clap::{Parser, ValueEnum};
use serde::Deserialize;
use std::path::PathBuf;
#[derive(Debug, Clone, Copy, ValueEnum, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Source {
Auto,
Adf,
Glass,
}
#[derive(Debug, Clone, Copy, ValueEnum)]
pub enum Format {
Pdf,
Jpeg,
}
#[derive(Debug, Clone, Copy, ValueEnum)]
pub enum ColorSpace {
Gray,
Color,
}
#[derive(Parser, Debug)]
pub struct ScannerOpt {
#[arg(name = "SCANNER")]
pub scanner: String,
#[arg(long)]
pub no_tls: bool,
}
#[derive(Parser, Debug)]
pub struct ScanOpt {
#[clap(flatten)]
pub scanner_opts: ScannerOpt,
#[arg(
short,
long,
name = "SOURCE",
default_value = "auto",
ignore_case(true)
)]
pub source: Source,
#[arg(short, long, name = "FORMAT", default_value = "pdf", ignore_case(true))]
pub format: Format,
#[arg(
short,
long,
name = "COLORSPACE",
default_value = "color",
ignore_case(true)
)]
pub color: ColorSpace,
#[arg(
short,
long,
name = "RESOLUTION",
default_value_t = 300,
value_parser = clap::builder::PossibleValuesParser::new(["300", "600"])
.map(|s| s.parse::<u32>().unwrap()),
)]
pub resolution: u32,
#[arg(
short = 'q',
long = "compression-quality",
name = "QUALITY",
default_value = "25"
)]
pub compression_quality: u32,
#[arg(long)]
pub disable_jpeg_fix: bool,
}
#[derive(Parser, Debug)]
pub struct WebOpt {
#[clap(flatten)]
pub scanner_opts: ScannerOpt,
#[arg(short, long, name = "PORT", default_value = "3000")]
pub port: u16,
#[arg(short, long, name = "ADDR", default_value = "127.0.0.1")]
pub listen: String,
#[arg(long)]
pub disable_jpeg_fix: bool,
}
#[derive(Parser, Debug)]
#[clap(version)]
pub enum Opt {
Status(ScannerOpt),
Scan(ScanOpt),
Web(WebOpt),
FixJpegHeight(FixJpegHeightOpt),
}
#[derive(Parser, Debug)]
pub struct FixJpegHeightOpt {
pub input: PathBuf,
pub output: PathBuf,
}
#[test]
fn verify_app() {
use clap::CommandFactory;
Opt::command().debug_assert()
}