cargo-winapp 0.1.1

Cargo subcommand for Windows app development with winapp CLI
mod commands;
mod util;

use anyhow::Result;
use clap::{ColorChoice, Parser, Subcommand};

#[derive(Parser)]
#[command(name = "cargo")]
#[command(bin_name = "cargo")]
#[command(color = ColorChoice::Always)]
enum Cargo {
    #[command(name = "winapp")]
    Winapp(WinappArgs),
}

#[derive(Parser)]
#[command(
    author,
    version,
    about = "Cargo subcommand for Windows app development with winapp CLI"
)]
struct WinappArgs {
    /// Enable verbose output
    #[arg(long, short, global = true)]
    verbose: bool,

    #[command(subcommand)]
    command: Commands,
}

#[derive(Subcommand)]
enum Commands {
    /// Build and apply debug identity to the executable
    Build {
        /// Arguments to pass to cargo build
        #[arg(trailing_var_arg = true, allow_hyphen_values = true)]
        cargo_args: Vec<String>,
    },

    /// Build with debug identity and run the executable
    Run {
        /// Arguments to pass to cargo build
        #[arg(trailing_var_arg = true, allow_hyphen_values = true)]
        cargo_args: Vec<String>,
    },

    /// Package as MSIX
    Pack {
        /// Input directory for layout (staging directory)
        #[arg(long, short = 'i', default_value = "dist-msix")]
        input: String,

        /// Output MSIX file path
        #[arg(long, short = 'o')]
        output: Option<String>,

        /// Arguments to pass to cargo build
        #[arg(trailing_var_arg = true, allow_hyphen_values = true)]
        cargo_args: Vec<String>,
    },
}

fn main() -> Result<()> {
    let Cargo::Winapp(args) = Cargo::parse();
    let verbose = args.verbose;

    match args.command {
        Commands::Build { cargo_args } => commands::build::run(cargo_args, verbose),
        Commands::Run { cargo_args } => commands::run::run(cargo_args, verbose),
        Commands::Pack {
            input,
            output,
            cargo_args,
        } => commands::pack::run(input, output, cargo_args, verbose),
    }
}