use crate::NodeLanguage;
use proto_core::{async_trait, Describable, Executable, Installable, ProtoError};
use std::path::{Path, PathBuf};
#[cfg(target_os = "windows")]
pub fn get_bin_name<T: AsRef<str>>(name: T) -> String {
format!("{}.exe", name.as_ref())
}
#[cfg(not(target_os = "windows"))]
pub fn get_bin_name<T: AsRef<str>>(name: T) -> String {
format!("bin/{}", name.as_ref())
}
#[async_trait]
impl Executable<'_> for NodeLanguage {
async fn find_bin_path(&mut self) -> Result<(), ProtoError> {
let bin_path = self.get_install_dir()?.join(get_bin_name("node"));
if bin_path.exists() {
self.bin_path = Some(bin_path);
} else {
return Err(ProtoError::ExecuteMissingBin(self.get_name(), bin_path));
}
Ok(())
}
fn get_bin_path(&self) -> Result<&Path, ProtoError> {
match self.bin_path.as_ref() {
Some(bin) => Ok(bin),
None => Err(ProtoError::MissingTool(self.get_name())),
}
}
fn get_globals_bin_dir(&self) -> Result<Option<PathBuf>, ProtoError> {
Ok(Some(self.base_dir.join("globals").join("bin")))
}
}