proto_go/
resolve.rs

1use crate::GoLanguage;
2use proto_core::{
3    async_trait, create_version_manifest_from_tags, load_git_tags, ProtoError, Resolvable, Tool,
4    Version, VersionManifest,
5};
6
7trait BaseVersion {
8    fn base_version(&self) -> String;
9}
10
11impl<'a> BaseVersion for Version<'a> {
12    fn base_version(&self) -> String {
13        format!("{}.{}", self.major, self.minor)
14    }
15}
16
17#[async_trait]
18impl Resolvable<'_> for GoLanguage {
19    fn get_resolved_version(&self) -> &str {
20        match self.version.as_ref() {
21            Some(version) => version,
22            None => "latest",
23        }
24    }
25
26    // https://go.dev/dl/?mode=json&include=all
27    async fn load_version_manifest(&self) -> Result<VersionManifest, ProtoError> {
28        let tags = load_git_tags("https://github.com/golang/go")
29            .await?
30            .iter()
31            .filter(|t| t.starts_with("go"))
32            .map(|t| {
33                t.strip_prefix("go")
34                    .unwrap()
35                    // go1.4rc1, go1.19beta, etc
36                    .replace("alpha", ".0-alpha")
37                    .replace("beta", ".0-beta")
38                    .replace("rc", ".0-rc")
39            })
40            .collect::<Vec<_>>();
41
42        let mut manifest = create_version_manifest_from_tags(tags);
43
44        manifest.inherit_aliases(&self.get_manifest()?.aliases);
45
46        Ok(manifest)
47    }
48
49    fn set_version(&mut self, version: &str) {
50        self.version = Some(version.to_owned());
51    }
52}