The cross-platform version manager toolset crates.io/crates/hyper-jump
at main 62 lines 1.8 kB view raw
1use anyhow::anyhow; 2use anyhow::Result; 3 4use crate::domain::package::Package; 5use crate::domain::package::PackageRegistry; 6use crate::ports::Output; 7use crate::ports::Paths; 8use crate::ports::Platform; 9use crate::ports::Process; 10use crate::ports::UsedVersionStore; 11 12pub async fn handle_proxy( 13 exec_name: &str, 14 rest_args: &[String], 15 registry: &PackageRegistry, 16 output: &impl Output, 17 paths: &impl Paths, 18 used_store: &impl UsedVersionStore, 19 platform: &impl Platform, 20 process: &impl Process, 21) -> miette::Result<()> { 22 if !rest_args.is_empty() && rest_args[0].eq(concat!("--", env!("CARGO_BIN_NAME"))) { 23 output 24 .write_line(&format!( 25 "{} v{}", 26 env!("CARGO_BIN_NAME"), 27 env!("CARGO_PKG_VERSION") 28 )) 29 .map_err(|err| miette::miette!(err))?; 30 return Ok(()); 31 } 32 33 let spec = registry.get_by_alias(exec_name).map_err(|err| miette::miette!(err))?; 34 let package = Package::from_spec(spec, platform).map_err(|err| miette::miette!(err))?; 35 36 handle_package_process(rest_args, package, paths, used_store, process) 37 .await 38 .map_err(|err| miette::miette!("{err}"))?; 39 40 Ok(()) 41} 42 43pub async fn handle_package_process( 44 args: &[String], 45 package: Package, 46 paths: &impl Paths, 47 used_store: &impl UsedVersionStore, 48 process: &impl Process, 49) -> Result<()> { 50 let downloads_dir = paths.downloads_dir(package.clone()).await?; 51 let used_version = used_store 52 .current(package.clone()) 53 .await? 54 .ok_or_else(|| anyhow!("No version in use for {}", package.alias()))?; 55 56 let location = downloads_dir 57 .join(used_version) 58 .join(package.binary_path()) 59 .join(package.binary_name()); 60 61 process.run(&location, args).await 62}