From 285940c60abd33371f6b4c2a97cd4181c7464e66 Mon Sep 17 00:00:00 2001 From: Dennis Schwerdel Date: Sat, 16 Jan 2021 23:44:43 +0100 Subject: [PATCH] Support for creating shell completions --- CHANGELOG.md | 1 + src/config.rs | 9 +++++++-- src/main.rs | 4 ++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b5318d..ecab01e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ This project follows [semantic versioning](http://semver.org). ### UNRELEASED +- [added] Support for creating shell completions - [removed] Removed dummy device type - [changed] Updated depdendencies - [changed] Changed Rust version to 1.49.0 diff --git a/src/config.rs b/src/config.rs index cec0309..1d7e56c 100644 --- a/src/config.rs +++ b/src/config.rs @@ -10,6 +10,7 @@ use std::{ net::{IpAddr, Ipv6Addr, SocketAddr} }; use structopt::StructOpt; +use structopt::clap::Shell; pub const DEFAULT_PEER_TIMEOUT: u16 = 300; @@ -325,7 +326,7 @@ pub struct Args { pub mode: Option, /// The shared password to encrypt all traffic - #[structopt(short, long, required_unless_one = &["private-key", "config", "genkey", "version"], env)] + #[structopt(short, long, required_unless_one = &["private-key", "config", "genkey", "version", "completion"], env)] pub password: Option, /// The private key to use @@ -458,7 +459,11 @@ pub struct Args { /// Migrate an old config file #[structopt(long, alias = "migrate", requires = "config")] - pub migrate_config: bool + pub migrate_config: bool, + + /// Generate shell completions + #[structopt(long)] + pub completion: Option } #[derive(Serialize, Deserialize, Debug, PartialEq, Default)] diff --git a/src/main.rs b/src/main.rs index 156f17d..dd73dcc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -234,6 +234,10 @@ fn main() { ); return } + if let Some(shell) = args.completion { + Args::clap().gen_completions_to(env!("CARGO_PKG_NAME"), shell, &mut io::stdout()); + return + } let logger = try_fail!(DualLogger::new(args.log_file.as_ref()), "Failed to open logfile: {}"); log::set_boxed_logger(Box::new(logger)).unwrap(); assert!(!args.verbose || !args.quiet);