From 82e662890f70170513ec3ce3ee825038e5f339f4 Mon Sep 17 00:00:00 2001 From: Vadim Anufriev Date: Tue, 6 Jan 2026 22:10:00 +0400 Subject: [PATCH] feat: add command for completions --- CHANGELOG.md | 3 ++- Cargo.lock | 10 ++++++++++ Cargo.toml | 1 + src/commands.rs | 33 +++++++++++++++++++++++++++++++++ src/handlers.rs | 11 +++++++++++ 5 files changed, 57 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55a95b7..24a1580 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,11 +6,12 @@ page. See [DEVELOPMENT_CYCLE.md](DEVELOPMENT_CYCLE.md) for more details. ## [Unreleased] - Add wallet subcommand `config` to save wallet configs - Add `wallets` command to list all wallets saved configs +- Added `completions` subcommand to generate shell completions ## [2.0.0] - Removed MSRV and bumped Rust Edition to 2024 -- Add `--pretty` flag for formatting outputs in human-readable form +- Added `--pretty` flag for formatting outputs in human-readable form - Updated `bdk_wallet ` to `2.1.0`, `bdk_bitcoind_rpc` to `0.21.0`, `bdk_esplora` to `0.22.1`, `bdk_kyoto` to `0.13.1` - Updated `tracing-subscriber` to 0.3.20 - Added `tr` script type to `compile` command to support creating taproot descriptors diff --git a/Cargo.lock b/Cargo.lock index 98036e6..f126cfc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -203,6 +203,7 @@ dependencies = [ "bdk_redb", "bdk_wallet", "clap", + "clap_complete", "cli-table", "dirs", "env_logger", @@ -721,6 +722,15 @@ dependencies = [ "strsim", ] +[[package]] +name = "clap_complete" +version = "4.5.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c0da80818b2d95eca9aa614a30783e42f62bf5fdfee24e68cfb960b071ba8d1" +dependencies = [ + "clap", +] + [[package]] name = "clap_derive" version = "4.5.49" diff --git a/Cargo.toml b/Cargo.toml index b7d610a..cf6bd78 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ license = "MIT" [dependencies] bdk_wallet = { version = "2.1.0", features = ["rusqlite", "keys-bip39", "compiler", "std"] } clap = { version = "4.5", features = ["derive","env"] } +clap_complete = "4.5" dirs = { version = "6.0.0" } env_logger = "0.11.6" log = "0.4" diff --git a/src/commands.rs b/src/commands.rs index 14ad9ea..96f9b88 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -18,6 +18,7 @@ use bdk_wallet::bitcoin::{ bip32::{DerivationPath, Xpriv}, }; use clap::{Args, Parser, Subcommand, ValueEnum, value_parser}; +use clap_complete::Shell; #[cfg(any(feature = "electrum", feature = "esplora", feature = "rpc"))] use crate::utils::parse_proxy_auth; @@ -127,7 +128,39 @@ pub enum CliSubCommand { }, /// List all saved wallet configurations. Wallets, + /// Generate tab-completion scripts for your shell. + /// + /// Outputs a shell-specific completion script to stdout. + /// To enable completions you need to redirect this output into the appropriate location for your shell. + /// + /// Bash: + /// bdk-cli completions bash > ~/.local/share/bash-completion/completions/bdk-cli + /// + /// Zsh: + /// bdk-cli completions zsh > ~/.zfunc/_bdk-cli + /// # Make sure ~/.zfunc is in your fpath (add to .zshrc): + /// # fpath=(~/.zfunc $fpath) + /// # autoload -Uz compinit && compinit + /// + /// Fish: + /// bdk-cli completions fish > ~/.config/fish/completions/bdk-cli.fish + /// + /// PowerShell: + /// bdk-cli completions powershell >> $PROFILE + /// + /// Elvish: + /// bdk-cli completions elvish >> ~/.elvish/rc.elv + /// + /// After installing the completion script, restart your shell or source + /// the configuration file for the changes to take effect. + #[command(verbatim_doc_comment)] + Completions { + /// Target shell syntax + #[arg(value_enum)] + shell: Shell, + }, } + /// Wallet operation subcommands. #[derive(Debug, Subcommand, Clone, PartialEq)] pub enum WalletSubCommand { diff --git a/src/handlers.rs b/src/handlers.rs index 1f867b4..0462e90 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -44,6 +44,7 @@ use bdk_wallet::{ descriptor::{Descriptor, Legacy, Miniscript}, miniscript::{Tap, descriptor::TapTree, policy::Concrete}, }; +use clap::CommandFactory; use cli_table::{Cell, CellStruct, Style, Table, format::Justify}; use serde_json::json; #[cfg(feature = "cbf")] @@ -1422,6 +1423,16 @@ pub(crate) async fn handle_command(cli_opts: CliOpts) -> Result { let descriptor = handle_descriptor_command(cli_opts.network, desc_type, key, pretty)?; Ok(descriptor) } + CliSubCommand::Completions { shell } => { + clap_complete::generate( + shell, + &mut CliOpts::command(), + "bdk-cli", + &mut std::io::stdout(), + ); + + Ok("".to_string()) + } }; result } -- 2.49.0