use shellexpand;
use std::collections::BTreeMap;
use std::path::PathBuf;
use crate::err;
use crate::model::asset_name::AssetName;
use crate::model::tool::{ToolInfo, ToolInfoTag};
#[derive(Debug, PartialEq, Eq)]
pub struct Config {
pub store_directory: String,
pub tools: BTreeMap<String, ConfigAsset>,
}
#[derive(Debug, PartialEq, Eq)]
pub struct ConfigAsset {
pub owner: Option<String>,
pub repo: Option<String>,
pub exe_name: Option<String>,
pub tag: Option<String>,
pub asset_name: AssetName,
}
impl From<ToolInfo> for ConfigAsset {
fn from(tool_info: ToolInfo) -> Self {
let tag = match tool_info.tag {
ToolInfoTag::Specific(version) => Some(version),
ToolInfoTag::Latest => None,
};
Self {
owner: Some(tool_info.owner),
repo: Some(tool_info.repo),
exe_name: Some(tool_info.exe_name),
tag,
asset_name: tool_info.asset_name,
}
}
}
impl Config {
pub fn ensure_store_directory(&self) -> PathBuf {
let expanded_store_directory = shellexpand::full(&self.store_directory);
let store_directory = match expanded_store_directory {
Err(e) => err::abort_with(e),
Ok(cow_path) => PathBuf::from(cow_path.into_owned()),
};
let has_store_directory = store_directory.as_path().is_dir();
if !has_store_directory {
err::abort_with(format!(
"Specified directory for storing tools doesn't exist: {}",
store_directory.display()
));
}
store_directory
}
}