You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

77 lines
2.3 KiB

use crate::config::FnmConfig;
use crate::installed_versions;
use crate::system_version;
use crate::user_version::UserVersion;
use crate::version::Version;
use colored::Colorize;
use log::info;
use snafu::{ensure, ResultExt, Snafu};
use std::path::{Path, PathBuf};
pub struct ApplicableVersion {
path: PathBuf,
version: Version,
}
impl ApplicableVersion {
pub fn path(&self) -> &Path {
&self.path
}
pub fn version(&self) -> &Version {
&self.version
}
}
pub fn choose_version_for_user_input<'a>(
requested_version: &'a UserVersion,
config: &'a FnmConfig,
) -> Result<Option<ApplicableVersion>, Error> {
let all_versions =
installed_versions::list(config.installations_dir()).context(VersionListing)?;
let result = if let UserVersion::Full(Version::Bypassed) = requested_version {
info!("Bypassing fnm: using {} node", "system".cyan());
Some(ApplicableVersion {
path: system_version::path(),
version: Version::Bypassed,
})
} else if let Some(alias_name) = requested_version.alias_name() {
let alias_path = config.aliases_dir().join(&alias_name);
ensure!(
alias_path.exists(),
CantFindVersion {
requested_version: requested_version.clone()
}
);
info!("Using Node for alias {}", alias_name.cyan());
Some(ApplicableVersion {
path: alias_path,
version: Version::Alias(alias_name),
})
} else {
let current_version = requested_version.to_version(&all_versions, &config);
current_version.map(|version| {
info!("Using Node {}", version.to_string().cyan());
let path = config
.installations_dir()
.join(version.to_string())
.join("installation");
ApplicableVersion {
path,
version: version.clone(),
}
})
};
Ok(result)
}
#[derive(Debug, Snafu)]
pub enum Error {
#[snafu(display("Can't find requested version: {}", requested_version))]
CantFindVersion { requested_version: UserVersion },
#[snafu(display("Can't list local installed versions: {}", source))]
VersionListing { source: installed_versions::Error },
}