pact 0.10.5

Pact consolidated CLI - pact_core_mock_server, pact_verifier, pact-stub-server, pact-plugin-cli, pact-broker-cli in a single binary
use clap::{ArgMatches, Command};
use std::process::{Command as Cmd, ExitCode};

pub fn add_docker_broker_subcommand() -> Command {
    Command::new("docker")
        .about("Run the Pact Broker as a Docker container")
        .subcommand(Command::new("start").about("Start the Pact Broker as a Docker container"))
        .subcommand(Command::new("stop").about("Stop the Pact Broker Docker container"))
        .subcommand(Command::new("remove").about("Remove the Pact Broker Docker container"))
}
pub fn run(args: &ArgMatches) -> Result<(), ExitCode> {
    match args.subcommand() {
        Some(("start", _args)) => {
            let command_args = vec![
                "run",
                "-d",
                "--name",
                "pact-broker",
                "-p",
                "9292:9292",
                "--env",
                "PACT_BROKER_PORT=9292",
                "--env",
                "PACT_BROKER_DATABASE_URL=sqlite:////tmp/pact_broker.sqlite",
                "--env",
                "'PACT_BROKER_BASE_URL=http://localhost http://localhost http://localhost:9292 http://pact-broker:9292 https://host.docker.internal http://host.docker.internal http://host.docker.internal:9292'",
                "pactfoundation/pact-broker:latest",
            ];

            println!(
                "Starting Pact Broker Docker container with command: docker {}",
                command_args.join(" ")
            );

            let output = Cmd::new("docker")
                .args(&command_args)
                .output()
                .expect("Failed to execute Docker command");

            if output.status.success() {
                println!("Docker container started successfully");
                Ok(())
            } else {
                let error_message = String::from_utf8_lossy(&output.stderr);
                println!("Failed to start Docker container: {}", error_message);
                Err(ExitCode::from(output.status.code().unwrap_or(1) as u8))
            }
        }
        Some(("stop", _args)) => {
            let output = Cmd::new("docker")
                .arg("stop")
                .arg("pact-broker")
                .output()
                .expect("Failed to execute Docker command");

            if output.status.success() {
                println!("Docker container stopped successfully");
                Ok(())
            } else {
                let error_message = String::from_utf8_lossy(&output.stderr);
                println!("Failed to stop Docker container: {}", error_message);
                Err(ExitCode::from(1))
            }
        }
        Some(("remove", _args)) => {
            let output = Cmd::new("docker")
                .arg("rm")
                .arg("pact-broker")
                .output()
                .expect("Failed to execute Docker command");

            if output.status.success() {
                println!("Docker container removed successfully");
                Ok(())
            } else {
                let error_message = String::from_utf8_lossy(&output.stderr);
                println!("Failed to remove Docker container: {}", error_message);
                Err(ExitCode::from(1))
            }
        }
        _ => {
            println!("⚠️  No option provided, try running docker --help");

            Ok(())
        }
    }
}