cli/commands/
version.rs

1/*---------------------------------------------------------------------------------------------
2 *  Copyright (c) Microsoft Corporation. All rights reserved.
3 *  Licensed under the MIT License. See License.txt in the project root for license information.
4 *--------------------------------------------------------------------------------------------*/
5
6use 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}