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 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 .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}