summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFederico Mena Quintero <federico@gnome.org>2023-01-30 18:07:55 -0600
committerFederico Mena Quintero <federico@gnome.org>2023-01-30 18:07:55 -0600
commit1708e3ca4ad4c2f6b60e0abafc3d8b596d2c9d79 (patch)
treeecf642b98f89669855201a5db5a3f2c025d599d8
parent5da5708d55271a26b7f045d8fa5864acebad7042 (diff)
downloadlibrsvg-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.rs102
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");