hyper-jump 0.11.0

A generalist all-in-one command-line version manager toolset for a more efficient development workflow.
use anyhow::anyhow;
use anyhow::Result;

use crate::domain::package::Package;
use crate::domain::package::PackageRegistry;
use crate::ports::Output;
use crate::ports::Paths;
use crate::ports::Platform;
use crate::ports::Process;
use crate::ports::UsedVersionStore;

pub async fn handle_proxy(
    exec_name: &str,
    rest_args: &[String],
    registry: &PackageRegistry,
    output: &impl Output,
    paths: &impl Paths,
    used_store: &impl UsedVersionStore,
    platform: &impl Platform,
    process: &impl Process,
) -> miette::Result<()> {
    if !rest_args.is_empty() && rest_args[0].eq(concat!("--", env!("CARGO_BIN_NAME"))) {
        output
            .write_line(&format!(
                "{} v{}",
                env!("CARGO_BIN_NAME"),
                env!("CARGO_PKG_VERSION")
            ))
            .map_err(|err| miette::miette!(err))?;
        return Ok(());
    }

    let spec = registry.get_by_alias(exec_name).map_err(|err| miette::miette!(err))?;
    let package = Package::from_spec(spec, platform).map_err(|err| miette::miette!(err))?;

    handle_package_process(rest_args, package, paths, used_store, process)
        .await
        .map_err(|err| miette::miette!("{err}"))?;

    Ok(())
}

pub async fn handle_package_process(
    args: &[String],
    package: Package,
    paths: &impl Paths,
    used_store: &impl UsedVersionStore,
    process: &impl Process,
) -> Result<()> {
    let downloads_dir = paths.downloads_dir(package.clone()).await?;
    let used_version = used_store
        .current(package.clone())
        .await?
        .ok_or_else(|| anyhow!("No version in use for {}", package.alias()))?;

    let location = downloads_dir
        .join(used_version)
        .join(package.binary_path())
        .join(package.binary_name());

    process.run(&location, args).await
}