summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarge Bot <marge-bot@gnome.org>2022-11-21 19:20:37 +0000
committerMarge Bot <marge-bot@gnome.org>2022-11-21 19:20:37 +0000
commit2e333d8ad9ec3387b8db641fdd7416d534e621a6 (patch)
tree3674f336113c41d3067632fb01a843f7d26039bb
parent0f91e867f07618d652f5dffc6ad60f4c64411c1d (diff)
parent39a376b1eb3fe4a9197c29f2524bb080b265f9a2 (diff)
downloadlibrsvg-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.lock18
-rw-r--r--Cargo.toml1
-rw-r--r--src/bin/rsvg-convert.rs32
3 files changed, 43 insertions, 8 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 65ce70fe..716806d0 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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"
diff --git a/Cargo.toml b/Cargo.toml
index a9aab9b6..9f209cb3 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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")