From e90b2daf5ecce520ad3c8c565d5d1daa7e7d0738 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Wed, 2 Oct 2024 10:10:58 -0500 Subject: [PATCH] refactor(complete): Pull our registration writing --- clap_complete/src/env/mod.rs | 51 ++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/clap_complete/src/env/mod.rs b/clap_complete/src/env/mod.rs index 6562dd38ba0..ea33d8d68a3 100644 --- a/clap_complete/src/env/mod.rs +++ b/clap_complete/src/env/mod.rs @@ -230,26 +230,8 @@ impl<'s, F: Fn() -> clap::Command> CompleteEnv<'s, F> { .unwrap_or(args.len()); args.drain(0..escape_index); if args.is_empty() { - let name = cmd.get_name(); - let bin = self - .bin - .as_deref() - .or_else(|| cmd.get_bin_name()) - .unwrap_or_else(|| cmd.get_name()); - let completer = if let Some(completer) = self.completer.as_deref() { - completer.to_owned() - } else { - let mut completer = std::path::PathBuf::from(completer); - if let Some(current_dir) = current_dir { - if 1 < completer.components().count() { - completer = current_dir.join(completer); - } - } - completer.to_string_lossy().into_owned() - }; - let mut buf = Vec::new(); - shell.write_registration(self.var, name, bin, &completer, &mut buf)?; + self.write_registration(&cmd, current_dir, shell, completer, &mut buf)?; std::io::stdout().write_all(&buf)?; } else { let mut buf = Vec::new(); @@ -284,6 +266,37 @@ impl<'s, F: Fn() -> clap::Command> CompleteEnv<'s, F> { })?; Ok(shell) } + + fn write_registration( + &self, + cmd: &clap::Command, + current_dir: Option<&std::path::Path>, + shell: &dyn EnvCompleter, + completer: OsString, + buf: &mut dyn std::io::Write, + ) -> Result<(), std::io::Error> { + let name = cmd.get_name(); + let bin = self + .bin + .as_deref() + .or_else(|| cmd.get_bin_name()) + .unwrap_or_else(|| cmd.get_name()); + let completer = if let Some(completer) = self.completer.as_deref() { + completer.to_owned() + } else { + let mut completer = std::path::PathBuf::from(completer); + if let Some(current_dir) = current_dir { + if 1 < completer.components().count() { + completer = current_dir.join(completer); + } + } + completer.to_string_lossy().into_owned() + }; + + shell.write_registration(self.var, name, bin, &completer, buf)?; + + Ok(()) + } } /// Collection of shell-specific completers