From e47e946e3ad438016adecc010d38449906c47448 Mon Sep 17 00:00:00 2001 From: Chevdor Date: Thu, 19 Jul 2018 17:20:11 +0200 Subject: [PATCH] Add support for shell completion (#340) * Add build script to generate completion scripts * Add installation doc for the shell auto-completion --- polkadot/cli/Cargo.toml | 6 +++++- polkadot/cli/build.rs | 43 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 polkadot/cli/build.rs diff --git a/polkadot/cli/Cargo.toml b/polkadot/cli/Cargo.toml index 3f6505ba6f..52600af8a6 100644 --- a/polkadot/cli/Cargo.toml +++ b/polkadot/cli/Cargo.toml @@ -3,9 +3,10 @@ name = "polkadot-cli" version = "0.2.0" authors = ["Parity Technologies "] description = "Polkadot node implementation in Rust." +build = "build.rs" [dependencies] -clap = { version = "2.27", features = ["yaml"] } +clap = { version = "~2.32", features = ["yaml"] } backtrace = "0.3" env_logger = "0.4" error-chain = "0.12" @@ -42,3 +43,6 @@ polkadot-runtime = { path = "../runtime" } polkadot-service = { path = "../service" } polkadot-transaction-pool = { path = "../transaction-pool" } names = "0.11.0" + +[build-dependencies] +clap = "~2.32" diff --git a/polkadot/cli/build.rs b/polkadot/cli/build.rs new file mode 100644 index 0000000000..9b878725ee --- /dev/null +++ b/polkadot/cli/build.rs @@ -0,0 +1,43 @@ +#[macro_use] +extern crate clap; + +use std::fs; +use std::env; +use clap::Shell; +use std::path::Path; + +fn main() { + build_shell_completion(); +} + +/// Build shell completion scripts for all known shells +/// Full list in https://github.com/kbknapp/clap-rs/blob/e9d0562a1dc5dfe731ed7c767e6cee0af08f0cf9/src/app/parser.rs#L123 +fn build_shell_completion() { + let shells = [Shell::Bash, Shell::Fish, Shell::Zsh, Shell::Elvish, Shell::PowerShell]; + for shell in shells.iter() { + build_completion(shell); + } +} + +/// Build the shell auto-completion for a given Shell +fn build_completion(shell: &Shell) { + let yml = load_yaml!("src/cli.yml"); + + let outdir = match env::var_os("OUT_DIR") { + None => return, + Some(dir) => dir, + }; + let path = Path::new(&outdir) + .parent().unwrap() + .parent().unwrap() + .parent().unwrap() + .join("completion-scripts"); + + fs::create_dir(&path).ok(); + + let mut app = clap::App::from_yaml(&yml); + app.gen_completions( + "polkadot", + *shell, + &path); +}