diff --git a/Cargo.lock b/Cargo.lock index 9e839edc0..9abe8d011 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -502,6 +502,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c0da80818b2d95eca9aa614a30783e42f62bf5fdfee24e68cfb960b071ba8d1" dependencies = [ "clap", + "clap_lex", + "is_executable", + "shlex", ] [[package]] @@ -1981,6 +1984,15 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" +[[package]] +name = "is_executable" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baabb8b4867b26294d818bf3f651a454b6901431711abb96e296245888d6e8c4" +dependencies = [ + "windows-sys 0.60.2", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.2" diff --git a/Cargo.toml b/Cargo.toml index 6e7aabeba..22821ee8c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,7 @@ base64 = "0.22" bytes = "^1.11" chrono = { version = "^0.4", default-features = false, features = ["clock", "serde"] } clap = { version = "^4.5", features = ["cargo", "color", "derive", "env"] } -clap_complete = { version = "^4.5" } +clap_complete = { version = "^4.5", features = ["unstable-dynamic"] } color-eyre = { version = "^0.6", features = ["default", "issue-url", "track-caller"] } config = { version = "^0.15", default-features = false } derive_builder = { version = "^0.20" } diff --git a/openstack_cli/src/bin/osc.rs b/openstack_cli/src/bin/osc.rs index d84602509..48bb70365 100644 --- a/openstack_cli/src/bin/osc.rs +++ b/openstack_cli/src/bin/osc.rs @@ -17,6 +17,8 @@ //! The binary of the CLI #![deny(missing_docs)] +use clap::CommandFactory; +use clap_complete::CompleteEnv; use color_eyre::eyre::{Report, Result}; use color_eyre::owo_colors::OwoColorize; use color_eyre::section::PanicMessage; @@ -28,7 +30,17 @@ use openstack_cli::error::OpenStackCliError; #[tokio::main] async fn main() -> Result<(), Report> { initialize_panic_handler()?; - openstack_cli::entry_point().await?; + + let args = env::args_os(); + match CompleteEnv::with_factory(openstack_cli::Cli::command).try_complete(args, None) { + Ok(true) => { + return Ok(()); + } + Ok(false) | Err(_) => { + openstack_cli::entry_point().await?; + } + } + Ok(()) }