diff options
author | Federico Mena Quintero <federico@gnome.org> | 2023-01-30 18:07:55 -0600 |
---|---|---|
committer | Federico Mena Quintero <federico@gnome.org> | 2023-01-30 18:07:55 -0600 |
commit | 1708e3ca4ad4c2f6b60e0abafc3d8b596d2c9d79 (patch) | |
tree | ecf642b98f89669855201a5db5a3f2c025d599d8 | |
parent | 5da5708d55271a26b7f045d8fa5864acebad7042 (diff) | |
download | librsvg-1708e3ca4ad4c2f6b60e0abafc3d8b596d2c9d79.tar.gz |
rsvg-bench.rs: port to clap
Part-of: <https://gitlab.gnome.org/GNOME/librsvg/-/merge_requests/789>
-rw-r--r-- | src/bin/rsvg-bench.rs | 102 |
1 files changed, 71 insertions, 31 deletions
diff --git a/src/bin/rsvg-bench.rs b/src/bin/rsvg-bench.rs index b9cf5833..56b67234 100644 --- a/src/bin/rsvg-bench.rs +++ b/src/bin/rsvg-bench.rs @@ -6,46 +6,34 @@ use cairo; use librsvg; use anyhow::Result; +use clap::{crate_version, value_parser}; use std::fs; -use std::io; use std::path::{Path, PathBuf}; use std::process; use std::thread; use std::time::Duration; -use structopt::{self, StructOpt}; use thiserror::Error; -#[cfg_attr(rustfmt, rustfmt_skip)] -#[derive(StructOpt, Debug)] -#[structopt(name = "rsvg-bench", about = "Benchmarking utility for librsvg.")] +#[derive(Debug)] +/// Command-line options for `rsvg-bench`. struct Opt { - #[structopt(short = "s", - long = "sleep", - help = "Number of seconds to sleep before starting to process SVGs", - default_value = "0")] + /// Number of seconds to sleep before starting to process SVGs. sleep_secs: usize, - #[structopt(short = "p", - long = "num-parse", - help = "Number of times to parse each file", - default_value = "100")] + /// Number of times to parse each file. num_parse: usize, - #[structopt(short = "r", - long = "num-render", - help = "Number of times to render each file", - default_value = "100")] + /// Number of times to render each file. num_render: usize, - #[structopt(help = "Input files or directories", parse(from_os_str))] - inputs: Vec<PathBuf>, - - #[structopt(long = "hard-failures", - help = "Whether to stop all processing when a file cannot be rendered")] + /// Whether to stop all processing when a file cannot be rendered. hard_failures: bool, + + /// Input files or directories. + inputs: Vec<PathBuf>, } -#[derive(Debug, Error)] +#[derive(Debug)] enum LoadingError { Skipped, Rsvg(librsvg::LoadingError), @@ -181,18 +169,70 @@ fn run(opt: &Opt) -> Result<()> { Ok(()) } +fn build_cli() -> clap::Command { + clap::Command::new("rsvg-bench") + .version(concat!("version ", crate_version!())) + .about("Benchmarking utility for librsvg.") + .arg( + clap::Arg::new("sleep") + .long("sleep") + .help("Number of seconds to sleep before starting to process SVGs") + .default_value("0") + .value_parser(str::parse::<usize>), + ) + .arg( + clap::Arg::new("num-parse") + .long("num-parse") + .help("Number of times to parse each file") + .default_value("1") + .value_parser(str::parse::<usize>), + ) + .arg( + clap::Arg::new("num-render") + .long("num-render") + .help("Number of times to render each file") + .default_value("1") + .value_parser(str::parse::<usize>), + ) + .arg( + clap::Arg::new("hard-failures") + .long("hard-failures") + .help("Stop all processing when a file cannot be rendered") + .action(clap::ArgAction::SetTrue), + ) + .arg( + clap::Arg::new("inputs") + .help("Input files or directories") + .value_parser(value_parser!(PathBuf)) + .action(clap::ArgAction::Append), + ) + +} + fn main() { - let opt = Opt::from_args(); + let cli = build_cli(); + + let matches = cli.get_matches(); - if opt.inputs.is_empty() { - eprintln!("No input files or directories specified\n"); + let sleep_secs = matches.get_one("sleep").copied().expect("already provided default_value"); + let num_parse = matches.get_one("num-parse").copied().expect("already provided default_value"); + let num_render = matches.get_one("num-render").copied().expect("already provided default_value"); + let hard_failures = matches.get_flag("hard-failures"); - let app = Opt::clap(); - let mut out = io::stderr(); - app.write_help(&mut out).expect("failed to write to stderr"); - eprintln!(""); + let inputs = if let Some(inputs) = matches.get_many("inputs") { + inputs.cloned().collect() + } else { + eprintln!("Must specify at least one SVG file or directory to process\n"); process::exit(1); - } + }; + + let opt = Opt { + sleep_secs, + num_parse, + num_render, + hard_failures, + inputs, + }; if opt.num_parse < 1 { eprintln!("Must parse files at least 1 time; please specify a higher number\n"); |