cargo-athena 0.8.0

Compile regular Rust into Argo Workflow YAML (library + `cargo athena` CLI)
Documentation
//! Cargo `--package` / `--bin` selection, shared by every `cargo athena`
//! subcommand. Resolves in this order:
//!
//!   1. `-p` / `--package` and `--bin` flags
//!   2. `[defaults].package` / `.bin` in `athena.toml`
//!   3. cargo's single-package / default-bin autodetect (caller's job;
//!      `resolve` just returns `None` here)

use cargo_athena::AthenaConfig;

#[derive(clap::Args)]
pub struct PkgSel {
    /// Cargo package to drive
    ///
    /// Default: `[defaults].package` in athena.toml, else the sole
    /// workspace package.
    #[arg(short = 'p', long)]
    package: Option<String>,
    /// Cargo bin within it
    ///
    /// Default: `[defaults].bin`, else the package's default bin.
    #[arg(long)]
    bin: Option<String>,
}

impl PkgSel {
    pub(crate) fn resolve(&self) -> (Option<String>, Option<String>) {
        let d = AthenaConfig::try_load()
            .unwrap_or_else(|e| die(&e))
            .defaults;
        (
            self.package.clone().or(d.package),
            self.bin.clone().or(d.bin),
        )
    }
}

fn die(m: &str) -> ! {
    eprintln!("cargo athena: {m}");
    std::process::exit(2);
}