+ use std::io;
+
+ use clap::IntoApp;
+ use clap::Parser;
+ use clap_complete::{
+ generate,
+ shells::{Bash, Elvish, Fish, PowerShell, Zsh},
+ };
+
+ use crate::Opts;
+
+ #[derive(Parser, Debug)]
+ pub struct Completion {
+ #[clap(subcommand)]
+ subcmd: Option<SubCommand>,
+ }
+
+ #[derive(Parser, Debug)]
+ pub enum SubCommand {
+ Bash,
+ Elvish,
+ Fish,
+ PowerShell,
+ Zsh,
+ }
+
+ impl Completion {
+ pub fn run(self) -> Result<(), anyhow::Error> {
+ let mut app = Opts::into_app();
+ match self.subcmd {
+ Some(SubCommand::Bash) => {
+ generate(Bash, &mut app, "pijul", &mut io::stdout());
+ }
+ Some(SubCommand::Elvish) => {
+ generate(Elvish, &mut app, "pijul", &mut io::stdout());
+ }
+ Some(SubCommand::Fish) => {
+ generate(Fish, &mut app, "pijul", &mut io::stdout());
+ }
+ Some(SubCommand::PowerShell) => {
+ generate(PowerShell, &mut app, "pijul", &mut io::stdout());
+ }
+ Some(SubCommand::Zsh) => {
+ generate(Zsh, &mut app, "pijul", &mut io::stdout());
+ }
+ None => {}
+ }
+ Ok(())
+ }
+ }