cargo-ohos-app 0.1.2

Cargo subcommand for packaging Rust GUI apps as OHOS applications
Documentation
use std::path::PathBuf;

use clap::{Args, Parser, Subcommand, ValueEnum};

#[derive(Debug, Parser)]
#[command(
    bin_name = "cargo ohos-app",
    author,
    version,
    about = "Package Rust GUI applications as OHOS apps"
)]
pub struct Cli {
    #[command(subcommand)]
    pub command: Commands,
}

#[derive(Debug, Subcommand)]
pub enum Commands {
    Init(InitCommand),
    Build(BuildCommand),
    Package(PackageCommand),
}

#[derive(Debug, Clone, Args)]
pub struct CommonArgs {
    #[arg(long)]
    pub deveco_studio_dir: Option<PathBuf>,
    #[arg(long)]
    pub ohpm_path: Option<PathBuf>,
    #[arg(long)]
    pub sdk_root: Option<PathBuf>,
    #[arg(long)]
    pub sdk_version: Option<String>,
    #[arg(long)]
    pub manifest_path: Option<PathBuf>,
    #[arg(long)]
    pub target: Option<String>,
    #[arg(long, value_enum)]
    pub abi: Option<Abi>,
    #[arg(long)]
    pub out_dir: Option<PathBuf>,
    #[arg(long)]
    pub bundle_name: Option<String>,
    #[arg(long)]
    pub module_name: Option<String>,
    #[arg(long)]
    pub release: bool,
    #[arg(long)]
    pub dry_run: bool,
}

#[derive(Debug, Clone, Args)]
pub struct InitCommand {
    #[command(flatten)]
    pub common: CommonArgs,
}

#[derive(Debug, Clone, Args)]
pub struct BuildCommand {
    #[command(flatten)]
    pub common: CommonArgs,
}

#[derive(Debug, Clone, Args)]
pub struct PackageCommand {
    #[command(flatten)]
    pub common: CommonArgs,
    #[arg(long, value_enum, default_value_t = PackageArtifact::Hap)]
    pub artifact: PackageArtifact,
    #[arg(long)]
    pub skip_init: bool,
    #[arg(long)]
    pub skip_rust_build: bool,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum PackageArtifact {
    Hap,
    App,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum Abi {
    #[value(name = "arm64-v8a")]
    Arm64V8a,
    #[value(name = "armeabi-v7a")]
    ArmeabiV7a,
    #[value(name = "x86_64")]
    X86_64,
    #[value(name = "loongarch64")]
    Loongarch64,
}

impl Abi {
    pub fn as_str(self) -> &'static str {
        match self {
            Abi::Arm64V8a => "arm64-v8a",
            Abi::ArmeabiV7a => "armeabi-v7a",
            Abi::X86_64 => "x86_64",
            Abi::Loongarch64 => "loongarch64",
        }
    }
}