cargo-winapp 0.1.1

Cargo subcommand for Windows app development with winapp CLI
//! cargo winapp run - Build with debug identity and run

use crate::util;
use anyhow::{Context, Result};
use std::process::Command;

pub fn run(cargo_args: Vec<String>, verbose: bool) -> Result<()> {
    crate::info!("[INFO] Building and running with package identity.");

    let info = util::load_project_info()?;

    // Build and get the executable path
    let build_result = util::build_and_get_exe(&info.manifest_dir, &cargo_args, verbose)?;
    let exe_path = &build_result.exe_path;

    // Apply debug identity
    crate::info!("[INFO] Applying debug identity...");

    let mut cmd = Command::new("winapp");
    cmd.arg("create-debug-identity")
        .arg(exe_path)
        .current_dir(&info.manifest_dir);

    if verbose {
        cmd.arg("--verbose");
    }

    let status = cmd.status().context(
        "Failed to run winapp. Is it installed? Run: winget install microsoft.winappcli --source winget",
    )?;

    if !status.success() {
        anyhow::bail!("winapp create-debug-identity failed");
    }

    // Run the executable
    crate::info!("[INFO] Running {}...", exe_path.display());
    crate::status!(verbose, "{}", "".repeat(50));

    let status = Command::new(exe_path)
        .status()
        .with_context(|| format!("Failed to run {:?}", exe_path))?;

    crate::status!(verbose, "{}", "".repeat(50));

    if status.success() {
        crate::info!("[INFO] Process exited successfully");
    } else {
        crate::info!("[WARN] Process exited with code: {:?}", status.code());
    }

    // Return the process exit code
    if !status.success() {
        std::process::exit(status.code().unwrap_or(1));
    }

    Ok(())
}