diff options
author | Marge Bot <marge-bot@gnome.org> | 2022-11-21 19:20:37 +0000 |
---|---|---|
committer | Marge Bot <marge-bot@gnome.org> | 2022-11-21 19:20:37 +0000 |
commit | 2e333d8ad9ec3387b8db641fdd7416d534e621a6 (patch) | |
tree | 3674f336113c41d3067632fb01a843f7d26039bb | |
parent | 0f91e867f07618d652f5dffc6ad60f4c64411c1d (diff) | |
parent | 39a376b1eb3fe4a9197c29f2524bb080b265f9a2 (diff) | |
download | librsvg-2e333d8ad9ec3387b8db641fdd7416d534e621a6.tar.gz |
Merge branch 'rsvg-convert-tab-completion' into 'main'
(#878): Add tab-completion for rsvg-convert
Closes #878
See merge request GNOME/librsvg!771
-rw-r--r-- | Cargo.lock | 18 | ||||
-rw-r--r-- | Cargo.toml | 1 | ||||
-rw-r--r-- | src/bin/rsvg-convert.rs | 32 |
3 files changed, 43 insertions, 8 deletions
@@ -180,9 +180,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.76" +version = "1.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a284da2e6fe2092f2353e51713435363112dfd60030e22add80be333fb928f" +checksum = "e9f73505338f7d905b19d18738976aae232eb46b8efc15554ffc56deb5d9ebe4" [[package]] name = "cfg-expr" @@ -241,6 +241,15 @@ dependencies = [ ] [[package]] +name = "clap_complete" +version = "4.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b0fba905b035a30d25c1b585bf1171690712fbb0ad3ac47214963aa4acc36c" +dependencies = [ + "clap 4.0.26", +] + +[[package]] name = "clap_derive" version = "4.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -995,6 +1004,7 @@ dependencies = [ "cast", "chrono", "clap 4.0.26", + "clap_complete", "criterion", "cssparser", "data-url", @@ -1315,9 +1325,9 @@ checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" [[package]] name = "os_str_bytes" -version = "6.4.0" +version = "6.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5bf27447411e9ee3ff51186bf7a08e16c341efdde93f4d823e8844429bed7e" +checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" [[package]] name = "pango" @@ -56,6 +56,7 @@ cairo-rs = { version = "0.16", features=["v1_16", "png", "pdf", "ps", "svg"] } cast = "0.3.0" chrono = "0.4.0" # rsvg-convert clap = { version = "4.0.17", features = ["cargo", "derive"] } # rsvg-convert +clap_complete = "4.0.5" # rsvg-convert cssparser = "0.28.0" data-url = "0.1" encoding = "0.2.33" diff --git a/src/bin/rsvg-convert.rs b/src/bin/rsvg-convert.rs index 586d8663..4895c2d4 100644 --- a/src/bin/rsvg-convert.rs +++ b/src/bin/rsvg-convert.rs @@ -1,4 +1,5 @@ use clap::crate_version; +use clap_complete::{Generator, Shell}; use gio::prelude::*; use gio::{Cancellable, FileCreateFlags, InputStream, OutputStream}; @@ -27,6 +28,7 @@ use librsvg::rsvg_convert_only::{ use librsvg::{AcceptLanguage, CairoRenderer, Color, Language, LengthUnit, Loader, RenderingError}; use std::ffi::OsString; +use std::io; use std::ops::Deref; use std::path::PathBuf; @@ -770,7 +772,7 @@ fn natural_geometry( }) } -fn parse_args() -> Result<Converter, Error> { +fn build_cli() -> clap::Command { let supported_formats = vec![ "png", #[cfg(system_deps_have_cairo_pdf)] @@ -783,7 +785,7 @@ fn parse_args() -> Result<Converter, Error> { "svg", ]; - let app = clap::Command::new("rsvg-convert") + clap::Command::new("rsvg-convert") .version(concat!("version ", crate_version!())) .about("Convert SVG files to other image formats") .disable_version_flag(true) @@ -1007,14 +1009,36 @@ fn parse_args() -> Result<Converter, Error> { .action(clap::ArgAction::SetTrue), ) .arg( + clap::Arg::new("completion") + .long("completion") + .help("Output shell completion for the given shell") + .num_args(1) + .action(clap::ArgAction::Set) + .value_parser(clap::value_parser!(Shell)), + ) + .arg( clap::Arg::new("FILE") .value_parser(clap::value_parser!(OsString)) .help("The input file(s) to convert") .num_args(1..) .action(clap::ArgAction::Append), - ); + ) +} + +fn print_completions<G: Generator>(gen: G, cmd: &mut clap::Command) { + clap_complete::generate(gen, cmd, cmd.get_name().to_string(), &mut io::stdout()); +} - let matches = app.get_matches(); +fn parse_args() -> Result<Converter, Error> { + let cli = build_cli(); + let matches = cli.get_matches(); + + if let Some(shell) = matches.get_one::<Shell>("completion").copied() { + let mut cmd = build_cli(); + eprintln!("Generating completion file for {}", shell); + print_completions(shell, &mut cmd); + std::process::exit(0); + } let format_str: &String = matches .get_one("format") |