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}