package manifest import ( "encoding/json" "errors" "fmt" "io/ioutil" "net/http" "train/pkg/config" ) type BinaryInfo struct { URL string `json:"url"` Checksum string `json:"checksum"` } 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]BinaryInfo `json:"binaries"` Uninstall []string `json:"uninstall"` } func FetchManifest(name string) (*Manifest, error) { cfg, err := config.LoadConfig() if err != nil { return nil, err } if url, ok := cfg.Packages[name]; ok { return fetchManifestFromURL(url) } var lastErr error for _, repo := range cfg.Repositories { url := fmt.Sprintf("%s/%s/manifest.json", repo, name) m, err := fetchManifestFromURL(url) if err == nil { return m, nil } lastErr = err } if lastErr == nil { lastErr = errors.New("не найден ни один репозиторий") } return nil, lastErr } func fetchManifestFromURL(url string) (*Manifest, error) { resp, err := http.Get(url) if err != nil { return nil, err } defer resp.Body.Close() if resp.StatusCode != 200 { return nil, errors.New("манифест пакета не найден по ссылке " + url) } data, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, err } var m Manifest if err := json.Unmarshal(data, &m); err != nil { return nil, err } return &m, nil }