package mr import ( "encoding/json" "errors" "fmt" "net/http" "net/url" ) const apiURL = "https://snapshot.debian.org/mr" // https://salsa.debian.org/snapshot-team/snapshot/blob/master/API // /mr/package// type Package struct { Comment string `json:"_comment"` Package string `json:"package"` Result []struct { Version string `json:"version"` } `json:"result"` } // /mr/package///binpackages type Binpackages struct { Comment string `json:"_comment"` Package string `json:"package"` Result []struct { Name string `json:"name"` Version string `json:"version"` } `json:"result"` Version string `json:"version"` } // /mr/binary// type Binary struct { Comment string `json:"_comment"` Binary string `json:"binary"` Result []struct { BinaryVersion string `json:"binary_version"` Name string `json:"name"` Source string `json:"source"` Version string `json:"version"` } `json:"result"` } // /mr/binary///binfiles type Binfiles struct { Comment string `json:"_comment"` Binary string `json:"binary"` BinaryVersion string `json:"binary_version"` Result []struct { Architecture string `json:"architecture"` Hash string `json:"hash"` } `json:"result"` } type Fileinfo struct { ArchiveName string `json:"archive_name"` FirstSeen string `json:"first_seen"` Name string `json:"name"` Path string `json:"path"` Size int `json:"size"` } // /mr/file//info type Info struct { Comment string `json:"_comment"` Hash string `json:"hash"` Result []Fileinfo `json:"result"` } func getJson(url string, target interface{}) (err error) { resp, err := http.Get(url) if err != nil { return } defer resp.Body.Close() if resp.StatusCode >= 400 { return fmt.Errorf("%d", resp.StatusCode) } return json.NewDecoder(resp.Body).Decode(target) } func GetPackage(name string) (pkg Package, err error) { query := fmt.Sprintf("%s/package/%s/", apiURL, url.QueryEscape(name), ) err = getJson(query, &pkg) return } func GetBinpackages(name, version string) (binpkgs Binpackages, err error) { query := fmt.Sprintf("%s/package/%s/%s/binpackages", apiURL, url.QueryEscape(name), url.QueryEscape(version), ) err = getJson(query, &binpkgs) return } func GetBinary(pkg string) (binary Binary, err error) { query := fmt.Sprintf("%s/binary/%s/", apiURL, url.QueryEscape(pkg), ) err = getJson(query, &binary) return } func GetBinfiles(binpkg, binversion string) (binfiles Binfiles, err error) { query := fmt.Sprintf("%s/binary/%s/%s/binfiles", apiURL, url.QueryEscape(binpkg), url.QueryEscape(binversion), ) err = getJson(query, &binfiles) return } func GetInfo(hash string) (info Info, err error) { query := fmt.Sprintf("%s/file/%s/info", apiURL, url.QueryEscape(hash), ) err = getJson(query, &info) if err != nil { return } if len(info.Result) != 1 { err = errors.New("API mismatch") } return }