From 0f1ba8f5fe6080eaf657e9e26078f6f33262d761 Mon Sep 17 00:00:00 2001 From: kpcyrd Date: Fri, 15 Mar 2024 11:40:39 +0100 Subject: [PATCH] Add command for shell completions --- Cargo.lock | 10 ++++++++++ crates/rqbit/Cargo.toml | 1 + crates/rqbit/src/main.rs | 21 +++++++++++++++++++-- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 33a5f94..b4ad151 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -389,6 +389,15 @@ dependencies = [ "strsim", ] +[[package]] +name = "clap_complete" +version = "4.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a51919c5608a32e34ea1d6be321ad070065e17613e168c5b6977024290f2630b" +dependencies = [ + "clap", +] + [[package]] name = "clap_derive" version = "4.4.7" @@ -2054,6 +2063,7 @@ dependencies = [ "anyhow", "bytes", "clap", + "clap_complete", "console-subscriber", "futures", "librqbit", diff --git a/crates/rqbit/Cargo.toml b/crates/rqbit/Cargo.toml index a5cb9a4..0b91e35 100644 --- a/crates/rqbit/Cargo.toml +++ b/crates/rqbit/Cargo.toml @@ -29,6 +29,7 @@ tokio = {version = "1", features = ["macros", "rt-multi-thread"]} console-subscriber = {version = "0.2", optional = true} anyhow = "1" clap = {version = "4", features = ["derive", "deprecated"]} +clap_complete = "4.4.5" tracing = "0.1" tracing-subscriber = {version = "0.3", features = ["env-filter"]} regex = "1" diff --git a/crates/rqbit/src/main.rs b/crates/rqbit/src/main.rs index 2242e8e..27246c9 100644 --- a/crates/rqbit/src/main.rs +++ b/crates/rqbit/src/main.rs @@ -1,7 +1,8 @@ -use std::{net::SocketAddr, path::PathBuf, sync::Arc, time::Duration}; +use std::{io, net::SocketAddr, path::PathBuf, sync::Arc, time::Duration}; use anyhow::Context; -use clap::{Parser, ValueEnum}; +use clap::{CommandFactory, Parser, ValueEnum}; +use clap_complete::Shell; use librqbit::{ api::ApiAddTorrentResponse, http_api::{HttpApi, HttpApiOptions}, @@ -172,6 +173,12 @@ impl From<&str> for InitialPeers { } } +#[derive(Parser)] +struct CompletionsOpts { + /// The shell to generate completions for + shell: Shell, +} + // server start // download [--connect-to-existing] --output-folder(required) [file1] [file2] @@ -179,6 +186,7 @@ impl From<&str> for InitialPeers { enum SubCommand { Server(ServerOpts), Download(DownloadOpts), + Completions(CompletionsOpts), } fn _start_deadlock_detector_thread() { @@ -519,5 +527,14 @@ async fn async_main(opts: Opts) -> anyhow::Result<()> { } } } + SubCommand::Completions(completions_opts) => { + clap_complete::generate( + completions_opts.shell, + &mut Opts::command(), + "rqbit", + &mut io::stdout(), + ); + Ok(()) + } } }