1use crate::config::Config;
2use crate::deployment_manager::DeploymentManager;
3use clap::Parser;
4
5#[derive(Parser)]
6pub struct CLI {
7 #[arg(value_name = "TAG", index = 1)]
8 pub tag: String,
9 #[arg(short, long)]
10 pub name: Option<String>,
11 #[arg(short, long, default_value = "/var/run/docker.sock")]
12 pub socket_path: String,
13 #[arg(
14 short,
15 long,
16 default_value = "https://bitbucket.org:financialpayments/plain-jane-proxy.git"
17 )]
18 pub repo_url: Option<String>,
19 #[arg(short, long, default_value = "/etc/traefik")]
20 pub mount_path: Option<String>,
21}
22
23pub async fn deploy(cli: &CLI) {
25 let config = match Config::from_env_and_cli(cli) {
27 Ok(config) => {
28 println!("Configuration loaded:");
29 println!(" Repository: {}", config.repo_url);
30 println!(" Mount path: {}", config.mount_path);
31 config
32 }
33 Err(e) => {
34 eprintln!("Configuration error: {}", e);
35 println!();
36 Config::show_configuration_help();
37 return;
38 }
39 };
40
41 let deployment_manager = DeploymentManager::new(cli.socket_path.clone());
42
43 if let Some(project_name) = &cli.name {
44 println!(
45 "Starting deployment for project '{}' with tag '{}'",
46 project_name, cli.tag
47 );
48
49 match deployment_manager
50 .rolling_deploy(project_name, &cli.tag, &config)
51 .await
52 {
53 Ok(()) => println!("Rolling deployment successful!"),
54 Err(e) => eprintln!("Rolling deployment failed: {}", e),
55 }
56 } else {
57 eprintln!("Project name is required for deployment. Use --name flag.");
58 println!();
59 println!("Examples:");
60 println!(
61 " ./app v1.2.3 --name my-traefik-project --repo-url https://github.com/org/repo.git --mount-path /opt/configs"
62 );
63 println!(
64 " ./app v1.2.3 --name my-traefik-project # Uses .env file for repo and mount path"
65 );
66 }
67}