From 76378bf279b9037576ae892ec102c33404bfd422 Mon Sep 17 00:00:00 2001 From: Turiiya <34311583+ttytm@users.noreply.github.com> Date: Thu, 19 Dec 2024 22:13:39 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20add=20arg=20to=20generate=20shell?= =?UTF-8?q?=20completions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 10 ++++++++++ Cargo.toml | 1 + src/modules/args.rs | 5 +++++ src/modules/params.rs | 9 +++++++++ 4 files changed, 25 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 1a4e241..65b2bc0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -162,6 +162,15 @@ dependencies = [ "strsim", ] +[[package]] +name = "clap_complete" +version = "4.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac2e663e3e3bed2d32d065a8404024dad306e699a04263ec59919529f803aee9" +dependencies = [ + "clap", +] + [[package]] name = "clap_derive" version = "4.5.18" @@ -1748,6 +1757,7 @@ dependencies = [ "anyhow", "chrono", "clap", + "clap_complete", "dialoguer", "dirs", "futures", diff --git a/Cargo.toml b/Cargo.toml index 21ce831..f9ab208 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,6 +40,7 @@ strum_macros = "0.26" tokio = { version = "1", features = ["macros", "rt-multi-thread"] } scopeguard = "1.2" unicode-width = "0.2" +clap_complete = "4.5.40" [dev-dependencies] strip-ansi-escapes = "0.2" diff --git a/src/modules/args.rs b/src/modules/args.rs index 0f9376b..3c4d128 100644 --- a/src/modules/args.rs +++ b/src/modules/args.rs @@ -1,6 +1,7 @@ use anyhow::{bail, Result}; use chrono::NaiveDate; use clap::{Parser, ValueEnum}; +use clap_complete::Shell; use serde::{Deserialize, Serialize}; use strum_macros::AsRefStr; @@ -34,6 +35,10 @@ pub struct Cli { /// Wipe wthrr's configuration data #[arg(short, long, group = "config_file_action")] pub reset: bool, + + /// Generate shell completions + #[arg(long, value_name = "SHELL")] + pub completions: Option, } #[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum, AsRefStr, Serialize, Deserialize, Hash)] diff --git a/src/modules/params.rs b/src/modules/params.rs index ac07f42..dbd57be 100644 --- a/src/modules/params.rs +++ b/src/modules/params.rs @@ -2,6 +2,8 @@ use std::collections::HashSet; use anyhow::{Context, Result}; use chrono::NaiveDate; +use clap::CommandFactory; +use clap_complete::generate; use dialoguer::{theme::ColorfulTheme, Confirm, Select}; use super::{ @@ -21,6 +23,13 @@ pub struct Params { impl Params { pub async fn merge(config: &Config, args: &Cli) -> Result { + if let Some(shell) = args.completions { + let mut cmd = Cli::command(); + let bin_name = cmd.get_name().to_string(); + generate(shell, &mut cmd, bin_name, &mut std::io::stdout()); + std::process::exit(0); + } + let language = match &args.language { Some(lang) => lang.to_string(), None => config.language.clone(),