The cross-platform version manager toolset
crates.io/crates/hyper-jump
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}