deslicer_cli/commands/change/
plan.rs1use 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}