package forge import ( "encoding/json" "fmt" "net/http" ) type GitHub struct { Owner string Repo string } type GitHubRelease struct { TagName string `json:"tag_name"` Assets []struct { Name string `json:"name"` BrowserDownloadURL string `json:"browser_download_url"` } `json:"assets"` } func NewGitHub(uri string) (GitHub, error) { var g GitHub _, paths, err := splitURI(uri) if err != nil { return g, err } g.Owner = paths[0] g.Repo = paths[1] return g, nil } func (g GitHub) Name() string { return g.Repo } func (g GitHub) latestRelease() (Release, error) { var release Release var r GitHubRelease u := fmt.Sprintf("https://api.github.com/repos/%s/%s/releases/latest", g.Owner, g.Repo) res, err := http.Get(u) if err != nil { return release, err } defer res.Body.Close() if err := json.NewDecoder(res.Body).Decode(&r); err != nil { return release, err } release.Name = r.TagName for _, a := range r.Assets { release.Assets = append(release.Assets, Asset{ Name: a.Name, DownloadURL: a.BrowserDownloadURL, }) } return release, nil } func (g GitHub) tagRelease(tag string) (Release, error) { var release Release var r GitHubRelease u := fmt.Sprintf("https://api.github.com/repos/%s/%s/releases/tags/%s", g.Owner, g.Repo, tag) res, err := http.Get(u) if err != nil { return release, err } defer res.Body.Close() if err := json.NewDecoder(res.Body).Decode(&r); err != nil { return release, err } release.Name = r.TagName for _, a := range r.Assets { release.Assets = append(release.Assets, Asset{ Name: a.Name, DownloadURL: a.BrowserDownloadURL, }) } return release, nil }