Skip to main content

spec_driven_docs/commands/
upgrade.rs

1//! `upgrade` subcommand: runtime-shape.
2//!
3//! Resolves the target, runs the upgrader, prints its report, and turns
4//! conflicts or unfinished removals into the red exit. Upgrade semantics
5//! live in `services::upgrader`.
6
7use crate::cli::upgrade::UpgradeArgs;
8use crate::context::AppContext;
9use crate::error::AppError;
10use crate::output;
11use crate::services::upgrader::{UpgradeOptions, upgrade};
12
13/// Upgrade an installed instance to this binary's version.
14///
15/// # Errors
16///
17/// [`AppError::Violations`] on conflicts or unfinished removals; whatever
18/// the upgrader refuses otherwise.
19pub fn run(ctx: &AppContext, args: UpgradeArgs) -> Result<(), AppError> {
20    let target = if args.target.is_absolute() {
21        args.target
22    } else if args.target == "." {
23        ctx.cwd.clone()
24    } else {
25        return Err(AppError::Usage("target must be absolute or .".to_string()));
26    };
27    let outcome = upgrade(&UpgradeOptions {
28        target,
29        dry_run: args.dry_run,
30    })?;
31    for line in &outcome.lines {
32        output::line(line);
33    }
34    if outcome.failures > 0 {
35        return Err(AppError::Violations {
36            count: outcome.failures,
37        });
38    }
39    Ok(())
40}