mirror of
https://github.com/clap-rs/clap
synced 2024-12-14 14:52:33 +00:00
feat(complete): Add CompleteArgs::complete
This commit is contained in:
parent
f807acef6d
commit
f374830df4
1 changed files with 41 additions and 27 deletions
|
@ -111,33 +111,7 @@ impl CompleteCommand {
|
||||||
pub fn try_complete(&self, cmd: &mut clap::Command) -> clap::error::Result<()> {
|
pub fn try_complete(&self, cmd: &mut clap::Command) -> clap::error::Result<()> {
|
||||||
debug!("CompleteCommand::try_complete: {self:?}");
|
debug!("CompleteCommand::try_complete: {self:?}");
|
||||||
let CompleteCommand::Complete(args) = self;
|
let CompleteCommand::Complete(args) = self;
|
||||||
if let Some(out_path) = args.register.as_deref() {
|
args.try_complete(cmd)
|
||||||
let mut buf = Vec::new();
|
|
||||||
let name = cmd.get_name();
|
|
||||||
let bin = cmd.get_bin_name().unwrap_or_else(|| cmd.get_name());
|
|
||||||
args.shell.write_registration(name, bin, bin, &mut buf)?;
|
|
||||||
if out_path == std::path::Path::new("-") {
|
|
||||||
std::io::stdout().write_all(&buf)?;
|
|
||||||
} else if out_path.is_dir() {
|
|
||||||
let out_path = out_path.join(args.shell.file_name(name));
|
|
||||||
std::fs::write(out_path, buf)?;
|
|
||||||
} else {
|
|
||||||
std::fs::write(out_path, buf)?;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
let current_dir = std::env::current_dir().ok();
|
|
||||||
|
|
||||||
let mut buf = Vec::new();
|
|
||||||
args.shell.write_complete(
|
|
||||||
cmd,
|
|
||||||
args.comp_words.clone(),
|
|
||||||
current_dir.as_deref(),
|
|
||||||
&mut buf,
|
|
||||||
)?;
|
|
||||||
std::io::stdout().write_all(&buf)?;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,6 +135,46 @@ pub struct CompleteArgs {
|
||||||
comp_words: Vec<OsString>,
|
comp_words: Vec<OsString>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl CompleteArgs {
|
||||||
|
/// Process the completion request
|
||||||
|
pub fn complete(&self, cmd: &mut clap::Command) -> std::convert::Infallible {
|
||||||
|
self.try_complete(cmd).unwrap_or_else(|e| e.exit());
|
||||||
|
std::process::exit(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Process the completion request
|
||||||
|
pub fn try_complete(&self, cmd: &mut clap::Command) -> clap::error::Result<()> {
|
||||||
|
debug!("CompleteCommand::try_complete: {self:?}");
|
||||||
|
if let Some(out_path) = self.register.as_deref() {
|
||||||
|
let mut buf = Vec::new();
|
||||||
|
let name = cmd.get_name();
|
||||||
|
let bin = cmd.get_bin_name().unwrap_or_else(|| cmd.get_name());
|
||||||
|
self.shell.write_registration(name, bin, bin, &mut buf)?;
|
||||||
|
if out_path == std::path::Path::new("-") {
|
||||||
|
std::io::stdout().write_all(&buf)?;
|
||||||
|
} else if out_path.is_dir() {
|
||||||
|
let out_path = out_path.join(self.shell.file_name(name));
|
||||||
|
std::fs::write(out_path, buf)?;
|
||||||
|
} else {
|
||||||
|
std::fs::write(out_path, buf)?;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let current_dir = std::env::current_dir().ok();
|
||||||
|
|
||||||
|
let mut buf = Vec::new();
|
||||||
|
self.shell.write_complete(
|
||||||
|
cmd,
|
||||||
|
self.comp_words.clone(),
|
||||||
|
current_dir.as_deref(),
|
||||||
|
&mut buf,
|
||||||
|
)?;
|
||||||
|
std::io::stdout().write_all(&buf)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Shell-specific completions
|
/// Shell-specific completions
|
||||||
pub trait ShellCompleter {
|
pub trait ShellCompleter {
|
||||||
/// The recommended file name for the registration code
|
/// The recommended file name for the registration code
|
||||||
|
|
Loading…
Reference in a new issue