proto_go/
execute.rs

1use crate::GoLanguage;
2use proto_core::{
3    async_trait, get_bin_name, get_home_dir, Describable, Executable, Installable, ProtoError,
4};
5use std::{
6    env,
7    path::{Path, PathBuf},
8};
9
10#[async_trait]
11impl Executable<'_> for GoLanguage {
12    async fn find_bin_path(&mut self) -> Result<(), ProtoError> {
13        let bin_path = self.get_install_dir()?.join("bin").join(get_bin_name("go"));
14
15        if bin_path.exists() {
16            self.bin_path = Some(bin_path);
17        } else {
18            return Err(ProtoError::ExecuteMissingBin(self.get_name(), bin_path));
19        }
20
21        Ok(())
22    }
23
24    fn get_bin_path(&self) -> Result<&Path, ProtoError> {
25        match self.bin_path.as_ref() {
26            Some(bin) => Ok(bin),
27            None => Err(ProtoError::MissingTool(self.get_name())),
28        }
29    }
30
31    fn get_globals_bin_dir(&self) -> Result<Option<PathBuf>, ProtoError> {
32        if let Ok(root) = env::var("GOBIN") {
33            return Ok(Some(PathBuf::from(root)));
34        }
35
36        let root = if let Ok(root) = env::var("GOROOT") {
37            PathBuf::from(root)
38        } else if let Ok(root) = env::var("GOPATH") {
39            PathBuf::from(root)
40        } else {
41            get_home_dir()?.join("go")
42        };
43
44        Ok(Some(root.join("bin")))
45    }
46}