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.
41 lines
1.2 KiB
41 lines
1.2 KiB
use super::command::Command; |
|
use crate::alias::create_alias; |
|
use crate::choose_version_for_user_input::{ |
|
choose_version_for_user_input, Error as ApplicableVersionError, |
|
}; |
|
use crate::config::FnmConfig; |
|
use crate::user_version::UserVersion; |
|
use thiserror::Error; |
|
|
|
#[derive(clap::Parser, Debug)] |
|
pub struct Alias { |
|
pub(crate) to_version: UserVersion, |
|
pub(crate) name: String, |
|
} |
|
|
|
impl Command for Alias { |
|
type Error = Error; |
|
|
|
fn apply(self, config: &FnmConfig) -> Result<(), Self::Error> { |
|
let applicable_version = choose_version_for_user_input(&self.to_version, config) |
|
.map_err(|source| Error::CantUnderstandVersion { source })? |
|
.ok_or(Error::VersionNotFound { |
|
version: self.to_version, |
|
})?; |
|
|
|
create_alias(config, &self.name, applicable_version.version()) |
|
.map_err(|source| Error::CantCreateSymlink { source })?; |
|
|
|
Ok(()) |
|
} |
|
} |
|
|
|
#[derive(Debug, Error)] |
|
pub enum Error { |
|
#[error("Can't create symlink for alias: {}", source)] |
|
CantCreateSymlink { source: std::io::Error }, |
|
#[error("Version {} not found locally", version)] |
|
VersionNotFound { version: UserVersion }, |
|
#[error(transparent)] |
|
CantUnderstandVersion { source: ApplicableVersionError }, |
|
}
|
|
|