1use std::path::{Path, PathBuf};
7
8use crate::{
9 desktop::{prompt_to_install, CodeVersionManager, RequestedVersion},
10 log,
11 util::{
12 errors::{AnyError, NoInstallInUserProvidedPath},
13 prereqs::PreReqChecker,
14 },
15};
16
17use super::{args::UseVersionArgs, CommandContext};
18
19pub async fn switch_to(ctx: CommandContext, args: UseVersionArgs) -> Result<i32, AnyError> {
20 let platform = PreReqChecker::new().verify().await?;
21 let vm = CodeVersionManager::new(ctx.log.clone(), &ctx.paths, platform);
22 let version = RequestedVersion::try_from(args.name.as_str())?;
23
24 let maybe_path = match args.install_dir {
25 Some(d) => Some(
26 CodeVersionManager::get_entrypoint_for_install_dir(&PathBuf::from(&d))
27 .await
28 .ok_or(NoInstallInUserProvidedPath(d))?,
29 ),
30 None => vm.try_get_entrypoint(&version).await,
31 };
32
33 match maybe_path {
34 Some(p) => {
35 vm.set_preferred_version(version.clone(), p.clone()).await?;
36 print_now_using(&ctx.log, &version, &p);
37 Ok(0)
38 }
39 None => {
40 prompt_to_install(&version);
41 Ok(1)
42 }
43 }
44}
45
46pub async fn show(ctx: CommandContext) -> Result<i32, AnyError> {
47 let platform = PreReqChecker::new().verify().await?;
48 let vm = CodeVersionManager::new(ctx.log.clone(), &ctx.paths, platform);
49
50 let version = vm.get_preferred_version();
51 println!("Current quality: {}", version);
52 match vm.try_get_entrypoint(&version).await {
53 Some(p) => println!("Installation path: {}", p.display()),
54 None => println!("No existing installation found"),
55 }
56
57 Ok(0)
58}
59
60fn print_now_using(log: &log::Logger, version: &RequestedVersion, path: &Path) {
61 log.result(format!("Now using {} from {}", version, path.display()));
62}