use clap::Args;
use std::path::PathBuf;
use usage::complete::CompleteOptions;
use usage::Spec;
use super::parse_file_or_stdin;
#[derive(Args)]
#[clap(visible_alias = "c", aliases = ["complete", "completions"])]
pub struct Completion {
#[clap(value_parser = ["bash", "fish", "nu", "powershell", "zsh"])]
shell: String,
bin: String,
#[clap(short, long)]
file: Option<PathBuf>,
#[clap(long, requires = "usage_cmd")]
cache_key: Option<String>,
#[clap(long, verbatim_doc_comment)]
include_bash_completion_lib: bool,
#[clap(long, default_value = "usage", env = "JDX_USAGE_BIN")]
usage_bin: String,
#[clap(long, required_unless_present = "file")]
usage_cmd: Option<String>,
}
impl Completion {
pub fn run(&self) -> miette::Result<()> {
let spec = match &self.file {
Some(file) => parse_file_or_stdin(file)?,
None => Spec::default(),
};
let spec = match self.file.is_some() {
true => Some(spec),
false => None,
};
let opts = CompleteOptions {
usage_bin: self.usage_bin.clone(),
shell: self.shell.clone(),
bin: self.bin.clone(),
cache_key: self.cache_key.clone(),
spec,
usage_cmd: self.usage_cmd.clone(),
include_bash_completion_lib: self.include_bash_completion_lib,
source_file: self.file.as_ref().map(|f| {
if f.as_os_str() == "-" {
"stdin".to_string()
} else {
f.to_string_lossy().to_string()
}
}),
};
println!("{}", usage::complete::complete(&opts)?.trim());
Ok(())
}
}