deslicer_cli/commands/change/
verify.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 plan_id: String,
12
13 #[arg(long)]
14 pub environment: Option<String>,
15}
16
17fn verification_failed(plan: &crate::observer_client::ChangePlan) -> bool {
18 if plan.status == "failed" {
19 return true;
20 }
21 plan.summary
22 .as_ref()
23 .is_some_and(|summary| !summary.is_empty())
24}
25
26pub async fn run(ctx: Ctx, args: Args) -> i32 {
27 let _ = &args.plan_id;
28 let (_session, client) = match authenticate(&ctx, args.environment.as_deref(), None).await {
29 Ok(pair) => pair,
30 Err(err) => return map_cli_error(err),
31 };
32
33 let plan = match client
34 .reconcile(&args.environment, ReconcileMode::PlanOnly)
35 .await
36 {
37 Ok(plan) => plan,
38 Err(err) => return map_cli_error(err),
39 };
40
41 if verification_failed(&plan) {
42 eprintln!("verification failed: drift detected");
43 return 1;
44 }
45
46 emit_change_plan(&plan)
47}