use anyhow::Result;
use clap::Command;
use clap_complete::{Shell, generate};
use mcp_execution_core::cli::ExitCode;
use std::io;
use tracing::info;
pub fn generate_completions(shell: Shell, cmd: &mut Command) {
info!("Generating {} completions", shell);
generate(shell, cmd, cmd.get_name().to_string(), &mut io::stdout());
}
pub async fn run(shell: Shell, cmd: &mut Command) -> Result<ExitCode> {
info!("Completions command for shell: {shell}");
generate_completions(shell, cmd);
Ok(ExitCode::SUCCESS)
}
#[cfg(test)]
mod tests {
use super::*;
use clap::Command;
#[test]
fn test_generate_completions_bash() {
let mut cmd = Command::new("test-cli");
generate_completions(Shell::Bash, &mut cmd);
}
#[test]
fn test_generate_completions_zsh() {
let mut cmd = Command::new("test-cli");
generate_completions(Shell::Zsh, &mut cmd);
}
#[test]
fn test_generate_completions_fish() {
let mut cmd = Command::new("test-cli");
generate_completions(Shell::Fish, &mut cmd);
}
#[test]
fn test_generate_completions_powershell() {
let mut cmd = Command::new("test-cli");
generate_completions(Shell::PowerShell, &mut cmd);
}
#[tokio::test]
async fn test_run_bash() {
let mut cmd = Command::new("test-cli");
let result = run(Shell::Bash, &mut cmd).await;
assert!(result.is_ok());
assert_eq!(result.unwrap(), ExitCode::SUCCESS);
}
#[tokio::test]
async fn test_run_zsh() {
let mut cmd = Command::new("test-cli");
let result = run(Shell::Zsh, &mut cmd).await;
assert!(result.is_ok());
}
#[tokio::test]
async fn test_run_fish() {
let mut cmd = Command::new("test-cli");
let result = run(Shell::Fish, &mut cmd).await;
assert!(result.is_ok());
}
#[tokio::test]
async fn test_run_powershell() {
let mut cmd = Command::new("test-cli");
let result = run(Shell::PowerShell, &mut cmd).await;
assert!(result.is_ok());
}
}