package main import ( "encoding/json" "fmt" "net/http" ) type Version interface { String() string } type VersionProvider interface { GetVersion() (Version, error) } func (g *GitHubVersionProvider) GetVersion() (Version, error) { url := fmt.Sprintf("https://api.github.com/repos/%s/releases", g.Repository) r, err := http.Get(url) if err != nil { return nil, fmt.Errorf("couldn't fetch release list for %s from GitHub: %w", g.Repository, err) } defer r.Body.Close() var releases []GitHubRelease err = json.NewDecoder(r.Body).Decode(&releases) if err != nil { return nil, fmt.Errorf("couldn't parse json: %w", err) } for _, release := range releases { if release.Draft && !g.IncludeDrafts { continue } if release.Prerelease && !g.IncludePrereleases { continue } return &release, nil } return nil, fmt.Errorf("couldn't find any suitable release on GitHub for project %s", g.Repository) } func main() { v := GitHubVersionProvider{Repository: "OpenSMTPD/OpenSMTPD"} latest, err := v.GetVersion() if err != nil { return } fmt.Println(latest.String()) yv := YamlVersionProvider{ File: "./versions.yml", Key: "opensmtpd_version", } current, err := yv.GetVersion() if err != nil { return } fmt.Println(current.String()) }