Skip to main content

deslicer_cli/commands/change/
plan.rs

1use clap::Args as ClapArgs;
2
3use crate::commands::pipeline::{authenticate, map_cli_error};
4use crate::observer_client::ReconcileMode;
5use crate::output::emit_change_plan;
6use crate::Ctx;
7
8#[derive(ClapArgs)]
9pub struct Args {
10    #[arg(long)]
11    pub environment: Option<String>,
12
13    #[arg(long, default_value = "plan-only")]
14    pub mode: String,
15}
16
17fn parse_mode(mode: &str) -> Result<ReconcileMode, ()> {
18    match mode {
19        "plan-only" => Ok(ReconcileMode::PlanOnly),
20        "apply" => Ok(ReconcileMode::Apply),
21        _ => Err(()),
22    }
23}
24
25pub async fn run(ctx: Ctx, args: Args) -> i32 {
26    let mode = match parse_mode(&args.mode) {
27        Ok(m) => m,
28        Err(()) => {
29            eprintln!("invalid mode: expected \"plan-only\" or \"apply\"");
30            return 1;
31        }
32    };
33
34    let (_session, client) = match authenticate(&ctx, args.environment.as_deref(), None).await {
35        Ok(pair) => pair,
36        Err(err) => return map_cli_error(err),
37    };
38
39    let plan = match client.reconcile(&args.environment, mode).await {
40        Ok(plan) => plan,
41        Err(err) => return map_cli_error(err),
42    };
43
44    emit_change_plan(&plan)
45}