package manifest import ( "encoding/json" "errors" "fmt" "io/ioutil" "net/http" "train/pkg/config" ) type Manifest struct { Name string `json:"name"` Version string `json:"version"` Mode string `json:"mode"` Source string `json:"source"` Checksum string `json:"checksum"` Dependencies []string `json:"dependencies"` Build []string `json:"build"` Binaries map[string]string `json:"binaries"` runtime.GOOS+"_"+runtime.GOARCH } func FetchManifest(name string) (*Manifest, error) { cfg, err := config.LoadConfig() if err != nil { return nil, err } var lastErr error for _, repo := range cfg.Repositories { url := fmt.Sprintf("%s/%s/manifest.json", repo, name) resp, err := http.Get(url) if err != nil { lastErr = err continue } defer resp.Body.Close() if resp.StatusCode != 200 { lastErr = errors.New("пакет не найден в репозитории " + repo) continue } data, err := ioutil.ReadAll(resp.Body) if err != nil { lastErr = err continue } var m Manifest if err := json.Unmarshal(data, &m); err != nil { lastErr = err continue } return &m, nil } if lastErr == nil { lastErr = errors.New("не найден ни один репозиторий") } return nil, lastErr }