Skip to main content

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