train-osource/pkg/manifest/manifest.go
wheelchairy b6ea0e0f59 upd2
2025-02-04 18:30:33 +03:00

64 lines
1.5 KiB
Go

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"`
}
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
}